从列表中删除元素而不使用索引

4
所以我正在按照以下方式迭代列表中的项目:
for virus in viruses:
    do stuff
    remove virus

如果我有索引,我只需要执行del virus[i],显然我可以调整代码以执行类似于for index in range(0, len(viruses))的操作,但这会使我想在for循环中完成的其他任务变得非常丑陋。是否有任何方法可以根据我当前迭代的病毒名称进行删除?
4个回答

10
这样怎么样?
for virus in viruses[:]:
    # do stuff
    viruses.remove(virus)  # remove "virus" from the original list

viruses[:]创建了我们的viruses列表的副本。需要注意的是,您还可以使用list(oldlist)来复制列表(我认为这更易读,但两种方法都可以)。您可以在此处阅读有关Python中列表的更多信息。


5

要按值删除项目,只需使用list.remove()

在迭代列表时从中删除元素可能会导致一些意外问题,因此请确保您正在迭代副本:

for virus in viruses[:]:
    # do stuff
    viruses.remove(virus)

1

列表有一个方法remove(),可以通过值来删除元素。

如果您正在修改列表并同时迭代它,则应使用reversed(),否则迭代将会漏掉一些元素:

for virus in reversed(viruses):
    viruses.remove(virus)

一个简单的例子:
In [203]: lis=range(0,10)

In [206]: for x in reversed(lis):
   .....:     if x%2==0:                #remove even numbers
   .....:         lis.remove(x)
   .....:         
   .....:         

In [207]: lis
Out[207]: [1, 3, 5, 7, 9]

或者使用浅拷贝:

In [212]: lis=range(10)

In [213]: for x in lis[:]:
    if x%2==0:
        lis.remove(x)
   .....:         
   .....:         

In [216]: lis
Out[216]: [1, 3, 5, 7, 9]

0

虽然你的选择之一是使用remove(),但可能会返回错误。另一个选择是将病毒(假设为一个列表)视为堆栈(或队列)。

for _ in xrange(len(viruses)):
    virus = viruses.pop()
    # do stuff with virus

如果 viruses 是一个字典(而 virus 是键),那么你只需要使用这个键就可以删除它:
import copy
for virus in copy.copy(viruses):
    # do stuff with virus
    del viruses[virus]

请参阅http://docs.python.org/tutorial/datastructures.html以获取更多信息


1
在迭代字典时不能更改它。 运行时错误:迭代期间字典大小发生了变化。 - Ashwini Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接