我正在迭代Python中的元组列表,并且如果它们符合某些条件,我会尝试删除它们.
for tup in somelist:
if determine(tup):
code_to_remove_tup
Run Code Online (Sandbox Code Playgroud)
我应该用什么代替code_to_remove_tup?我无法弄清楚如何以这种方式删除项目.
for item in somelist:
if determine(item):
code_to_remove_item
Run Code Online (Sandbox Code Playgroud)
似乎共识就是这样的
somelist[:] = [x for x in somelist if not determine(x)]
Run Code Online (Sandbox Code Playgroud)
但是,我认为如果你只删除一些项目,大多数项目都被复制到同一个对象中,也许这很慢.在回答另一个相关问题时,有人建议:
for item in reversed(somelist):
if determine(item):
somelist.remove(item)
Run Code Online (Sandbox Code Playgroud)
但是,这里list.remove将搜索项目,即列表长度为O(N).可能我们受到限制,因为列表表示为数组而不是链表,因此删除项目后需要移动所有内容.但是,这里建议collections.dequeue表示为双向链表.然后可以在迭代时在O(1)中移除.我们如何实现这一目标?
更新:我也做了一些时间测试,使用以下代码:
import timeit
setup = """
import random
random.seed(1)
b = [(random.random(),random.random()) for i in xrange(1000)]
c = []
def tokeep(x):
return (x[1]>.45) and (x[1]<.5)
"""
listcomp = """
c[:] = [x for x in b if tokeep(x)]
""" …Run Code Online (Sandbox Code Playgroud) 我在python脚本(v2.6)中有几个实例,我需要在其中修改列表.我需要从列表中弹出值以响应用户的交互式输入,并且想知道最干净的方法.目前我有一个非常脏的解决方案:a)将列表中的项目设置为我要删除为False并使用过滤器或列表推导删除它们或b)在循环中生成一个全新的列表,这似乎是不必要的将变量添加到命名空间并占用内存.
这个问题的一个例子如下:
for i, folder in enumerate(to_run_folders):
if get_size(folder) < byte_threshold:
ans = raw_input(('The folder {0}/ is less than {1}MB.' + \
' Would you like to exclude it from' + \
' compression? ').format(folder, megabyte_threshold))
if 'y' in ans.strip().lower():
to_run_folders.pop(i)
Run Code Online (Sandbox Code Playgroud)
我想查看列表中的每个文件夹.如果当前文件夹小于特定大小,我想询问用户是否要将其排除.如果是,请从列表中弹出文件夹.
这个例程的问题是,如果我遍历列表,我会得到意外的行为并提前终止.如果我通过切片迭代副本,pop不会拉出正确的值,因为索引被移动并且问题在弹出更多项时会复合.我还需要在我的脚本的其他区域中进行此类动态列表调整.这种功能有什么干净的方法吗?
我必须从数组中删除所有特定值(如果有的话),所以我写道:
while value_to_remove in my_array:
my_array.remove(value_to_remove)
Run Code Online (Sandbox Code Playgroud)
通过一个命令,还有更多的pythonic方法吗?