【问题标题】:Python list iteration and deletionPython列表迭代和删除
【发布时间】: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


    【解决方案1】:

    忘记做这件事。特别是如果您的列表不是很长,以至于多次迭代它是一件大事。

    cpt1 = sum(1 for x in liste if x != 2)
    cpt2 = sum(1 for x in liste if x == 2)
    

    【讨论】:

    • 感谢回答。但我已经用关于我的目标的更多细节编辑了我的问题。我很抱歉第一次不够清楚。
    • 那么,将求和运算替换为实际运算。
    【解决方案2】:

    您可以在迭代和从中删除元素之前简单地复制列表:

    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[:] 是用于复制列表的著名习语。它实际上是从第一个元素到最后一个元素的切片,其结果是返回一个包含原始元素的所有元素的新列表。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我认为是一个参考,因为正如您在我的问题的编辑部分看到的那样,根据删除功能,我有不同的结果。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2021-03-04
        • 1970-01-01
        • 2013-01-29
        • 2017-09-17
        • 2014-03-15
        • 2018-07-18
        • 2011-09-23
        • 2018-09-26
        相关资源
        最近更新 更多