从列表中删除正在迭代的对象

时间:2013-06-13 16:18:41

标签: python list

考虑:

fooList = [1, 2, 3, 4] # Ints for example only, in real application using objects

for foo in fooList:
    if fooChecker(foo):
        remove_this_foo_from_list

如何从列表中删除特定的foo?请注意,我仅使用整数,在实际应用程序中有一个任意对象列表。

感谢。

3 个答案:

答案 0 :(得分:8)

迭代列表的浅表副本。

由于您无法在迭代时修改列表,因此您需要迭代列表的浅表副本。

fooList = [1, 2, 3, 4] 

for foo in fooList[:]: #equivalent to list(fooList), but much faster
    if fooChecker(foo):
        fooList.remove(foo)

答案 1 :(得分:8)

一般来说,你只是不想这样做。而是构建一个新列表。大多数情况下,这是通过list comprehension

完成的
fooListFiltered = [foo for foo in fooList if not fooChecker(foo)]

或者,生成器表达式(我上面链接的视频包含生成器表达式和列表推导)或filter()(请注意,在2.x中,filter() 不是 lazy - 使用生成器表达式或代替itertools.ifilter()可能更合适(例如,一个太大而无法读入内存的大文件将无法以这种方式工作,但会使用生成器表达式。)< / p>

如果您需要来实际修改列表(很少见,但有时可能是这种情况),那么您可以分配回来:

fooList[:] = fooListFiltered

答案 2 :(得分:-1)

使用filter

newList = list(filter(fooChecker, fooList))

newItems = filter(fooChecker, fooList))

for item in newItems:
    print item # or print(item) for python 3.x

http://docs.python.org/2/library/functions.html#filter