所以我以这种方式迭代列表中的项目:
for virus in viruses:
do stuff
remove virus
如果我有索引,我可以只做 del virus[i],我显然可以调整代码来做类似的事情for index in range(0, len(viruses))
,但这开始让代码很快变得丑陋,因为我想在 for 循环中做其他事情. 无论如何,我可以根据我当前正在迭代的病毒的名称来删除吗?
所以我以这种方式迭代列表中的项目:
for virus in viruses:
do stuff
remove virus
如果我有索引,我可以只做 del virus[i],我显然可以调整代码来做类似的事情for index in range(0, len(viruses))
,但这开始让代码很快变得丑陋,因为我想在 for 循环中做其他事情. 无论如何,我可以根据我当前正在迭代的病毒的名称来删除吗?
这个怎么样:
for virus in viruses[:]:
# do stuff
viruses.remove(virus) # remove "virus" from the original list
viruses[:]
创建我们viruses
列表的副本。作为说明,您还可以使用list(oldlist)
复制列表(我发现这更具可读性,但任何一个都可以)。您可以在此处阅读有关 python 列表的更多信息。
要按其值删除项目,只需使用list.remove()
:
在迭代列表时从列表中删除元素可能会导致一些意想不到的问题,因此请确保您正在迭代副本:
for virus in viruses[:]:
# do stuff
viruses.remove(virus)
列表有一个方法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]
尽管您的选择之一是使用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