从没有索引的列表中删除元素

时间:2012-10-02 21:51:22

标签: python

所以我以这种方式迭代列表中的项目:

for virus in viruses:
    do stuff
    remove virus

如果我有索引,我可以做del病毒[i],我显然可以调整代码来执行像for index in range(0, len(viruses))这样的操作,但这会让其他东西的代码很快变得丑陋我想在for循环中做。无论如何我可以根据我正在迭代的病毒名称删除吗?

4 个答案:

答案 0 :(得分:6)

这个怎么样:

for virus in viruses[:]:
    # do stuff
    viruses.remove(virus)  # remove "virus" from the original list

viruses[:]会创建viruses列表的副本。作为一个注释,您还可以使用list(oldlist)来复制列表(我发现这更具可读性,但两者都可以使用)。您可以在python here中阅读有关列表的更多信息。

答案 1 :(得分:4)

要按价值移除项目,请使用list.remove()

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

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

答案 2 :(得分: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]

答案 3 :(得分:1)

虽然您的一个选择是使用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