我认为重复
Remove items from a list while iterating
最佳解决方案是:
somelist[:] = [tup for tup in somelist if determine(tup)]
我不深入了解它是如何工作的,但似乎有效!!!
现在我明白它是如何运作的! (2017年2月5日)
我是一个python初学者,我在列表迭代和删除中发现了一些奇怪的东西。这是我的代码:
# -*- coding: utf-8 -*-s
#
# Fichier: testques.py
#
liste = [0,1,2,3,4,5,6,7,8,9]
cpt1=0
cpt2=0
cpt3=len(liste)
for i in liste:
if i != 2:
cpt1 += 1
else:
cpt2 += 1
del liste[i]
print cpt1
print cpt2
print cpt3
>python test.py
8
1
10
如您所见,8 + 1不是10。
我的意思是“i”只是对列表索引的引用。当我删除元素列表时,我删除的元素下面的所有元素都会上升一个级别,然后下一个元素就不会被...解析了。
那么有人可以帮助我实现最终得到以下结果的目标: 9 1 10
3个答案后编辑 我的目标是不计算等于2的元素数量。
实际上,我列表中的每个元素都是一个字典,我想删除所有列表项,其中每个字典的xxx键的值不是7位数。之后,我将在现在清洁列表上执行其他操作。这就是我试图实现的目标。
很抱歉,在第一个问题中没有足够清楚。
这是我的真实代码:
cpt = 0
liste_longueur_totale = len(i)
liste_longueur_clean = 0
liste_delete = 0
numero = re.compile('^[0-9]{7}$')
for row in i:
if re.match(numero, row['j_numero']):
liste_longueur_clean += 1
cpt += 1
else:
liste_delete += 1
print liste_delete, '-', i[cpt]['j_id'], '-', i[cpt]['j_numero']
del i[cpt]
cpt += 1
print "%s : %s + %s" % (liste_longueur_totale,liste_longueur_clean,liste_delete )
print len(i)
“i”是703个项目的列表。每一个都是一个词典。
当我运行它时,我得到以下结果:
703: 673 + 15
688
当我在没有行的情况下运行相同的代码时:
del i[cpt]
我有以下结果:
703: 681 + 21
703
实际上我知道有21个项目没有响应re.match()
然后,我有点困惑!
答案 0 :(得分:1)
忘记这样做。特别是如果你的列表不是那么长,多次迭代它是一件大事。
cpt1 = sum(1 for x in liste if x != 2)
cpt2 = sum(1 for x in liste if x == 2)
答案 1 :(得分:1)
您可以在迭代并从中删除元素之前复制列表:
liste = [0,1,2,3,4,5,6,7,8,9]
cpt1=0
cpt2=0
cpt3=len(liste)
# Just add [:] here. See explanation below.
for i in liste[:]:
if i != 2:
cpt1 += 1
else:
cpt2 += 1
del liste[i]
print cpt1
print cpt2
print cpt3
list[:]
是用于复制列表的众所周知的习惯用语。它实际上是从第一个元素到最后一个元素的切片,其结果是返回一个包含原始元素的新列表。
答案 2 :(得分:0)
实际上我不是列表索引的引用,它是列表项,所以当你删除它时你会使你的列表更短,len(liste)= 9,如果你只想要一个列表索引数组使用枚举(而不是,虽然我没有看到删除索引的重点
答案 3 :(得分:0)
如果你想计算列表中有多少2个,你只需输入print liste.count(2)
即可获得1.要获得9,你可以减去len(liste) - liste.count(2)
或遵循Ignacio解决方案: sum(1 for x in liste if x != 2)
。