【问题标题】:for loop, not all items that fulfill the condition are removed [duplicate]for循环,并非所有满足条件的项目都被删除[重复]
【发布时间】:2017-12-27 16:29:47
【问题描述】:

我有一个 for 循环,它应该从包含“0”的列表中删除所有字符串项。但是,它只会删除其中的一部分。

for e in l:
    if '0' in e:
        l.remove(e)

在我的例子中,l 是一个转换为字符串的整数列表,在我的测试运行中,这个列表在执行 for 循环之前看起来像这样:

['12345', '23456', '34567', '45678', '56789', '67891', '78910', '89101', '91011', '10111', '01112', '11121', '11214', '12141', '21414', '14145', '41455', '14555', '45550', '55500', '55008', '50088', '00887']

然后像这样:

['12345', '23456', '34567', '45678', '56789', '67891', '89101', '10111', '11121', '11214', '12141', '21414', '14145', '41455', '14555', '55500', '50088']

只删除了六个元素,但仍然保留了一些仍然包含“0”的元素。

【问题讨论】:

  • 迭代列表时不要改变列表。此外,使用.remove(..) 使其成为O(n^2) 算法。
  • 如果您正在寻找它为什么不起作用的解释,那是因为当它删除一个元素时,列表中的每个其他元素都会移到一个之上,这意味着将跳过一个元素在下一次迭代中,所以如果连续两个有 0 则第二个将被 for 循环跳过

标签: python string list for-loop


【解决方案1】:

在迭代过程中不要移除元素

l =  ['12345', '23456', '34567', '45678', '56789', '67891', '78910', '89101', '91011', '10111', '01112', '11121', '11214', '12141', '21414', '14145', '41455', '14555', '45550', '55500', '55008', '50088', '00887']

new_l = [ele for ele in l if '0' not in ele] 

['12345', '23456', '34567', '45678', '56789', '67891', '11121', '11214', '12141', '21414', '14145', '41455', '14555']

【讨论】:

    【解决方案2】:

    在迭代列表时更改列表是个坏主意。相反,您可以创建一个新列表并仅将 l 中不包含 0 的元素添加到其中,如下所示:

    res=[]
    
    for e in l:
        if '0' not in e:
            res.append(e)
    

    您也可以通过列表理解来做到这一点:

    res=[e for e in l if '0' not in e]
    

    【讨论】:

    • 更好:res = [el for el in l if '0' not in el]
    • @ChristianDean 我刚刚添加了一分钟 :)
    【解决方案3】:

    发生这种情况是因为每当您有 2 个需要删除的连续元素时,

    例如,列表是 a b c d 并且您想要删除 bc 并且当前位置位于b.
    因此,当您删除 b 时,列表变为 a c d,当前位置为 c

    当您进行迭代时,当前位置将移动到 d 和 @ 987654329@ 被跳过。

    ChristianDean 建议的解决方案是创建一个包含您想要保留的值的新列表

    res = [el for el in l if '0' not in el]
    

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2021-06-06
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多