Python列表迭代和删除

时间:2012-11-22 23:50:23

标签: python list python-2.7 iteration

  

我认为重复

     

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()

然后,我有点困惑!

4 个答案:

答案 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)