1

我认为重复

迭代时从列表中删除项目

最佳解决方案是:

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

然后,我有点困惑!

4

4 回答 4

1

忘记用艰难的方式去做吧。特别是如果您的列表不是那么长,以至于多次迭代它是一件大事。

cpt1 = sum(1 for x in liste if x != 2)
cpt2 = sum(1 for x in liste if x == 2)
于 2012-11-22T23:54:43.150 回答
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[:]是复制列表的著名习语。它实际上是从第一个元素到最后一个元素的切片,其结果是返回一个包含原始元素所有元素的新列表。

于 2012-11-22T23:56:19.873 回答
0

实际上 i 不是对列表索引的引用,它是列表项,因此当您删除它时,您会使列表更短,len(liste)=9,如果您只想要一个列表索引数组,请改用 enumerate(liste) ,虽然我没有看到删除索引的意义

于 2012-11-22T23:58:14.353 回答
0

如果您想计算列表中有多少个 2,您只需键入print liste.count(2)即可得到 1。要得到 9,您可以减去len(liste) - liste.count(2)或遵循 Ignacio 解决方案:sum(1 for x in liste if x != 2)

于 2012-11-23T00:09:13.380 回答