1

考虑:

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从列表中删除?请注意,我仅使用整数作为示例,在实际应用程序中存在任意对象的列表。

谢谢。

4

3 回答 3

8

迭代列表的浅表副本。

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

fooList = [1, 2, 3, 4] 

for foo in fooList[:]: #equivalent to list(fooList), but much faster
    if fooChecker(foo):
        fooList.remove(foo)
于 2013-06-13T16:19:21.767 回答
8

通常,您只是不想这样做。相反,请构建一个新列表。大多数情况下,这是通过列表理解完成的:

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

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

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

fooList[:] = fooListFiltered
于 2013-06-13T16:19:46.047 回答
-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

于 2013-06-13T16:22:40.763 回答