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

dot*_*hen 1 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
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Ash*_*ary 8

迭代列表的浅表副本.

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

fooList = [1, 2, 3, 4] 

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


Gar*_*tty 8

一般来说,你只是不想这样做.而是构建一个新列表.大多数情况下,这是通过列表理解来完成的:

fooListFiltered = [foo for foo in fooList if not fooChecker(foo)]
Run Code Online (Sandbox Code Playgroud)

另外,发电机表达(我的视频上面链接涵盖发电机表达式以及列表理解)或filter()(注意,在2.x中,filter()是不是懒惰-用生成器表达式或itertools.ifilter()代替)可能更加合适(例如,一个大文件太大而无法读入内存将无法以这种方式工作,但会使用生成器表达式).

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

fooList[:] = fooListFiltered
Run Code Online (Sandbox Code Playgroud)