【发布时间】:2012-11-11 08:52:56
【问题描述】:
我认为是重复的
Remove items from a list while iterating
最佳解决方案是:
somelist[:] = [tup for tup in somelist if determine(tup)]
我不深入了解它是如何工作的,但似乎可以工作!!!
现在我明白它是如何工作的了!! (2017/02/05)
我是一个 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”只是对列表索引的引用。当我删除元素列表时,我删除的元素下面的所有元素都会上升一级,然后下一个元素不会被 for ... in 解析。
那么有人可以帮助我实现最终获得以下结果的目标: 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()
然后,我有点困惑!
【问题讨论】:
标签: python list python-2.7 iteration