【问题标题】:A flaw in Python or am I missing some concept? [duplicate]Python中的一个缺陷还是我错过了一些概念? [复制]
【发布时间】:2020-08-07 04:45:26
【问题描述】:

我有一个包含更多列表和零的列表。

checks =[[1], [2, 6, 10, 9], [3, 7, 8], [4], [5], 0, 0, 0, 0, 0, [11]]

我打算删除所有零和长度为 1 的列表。我编写了以下代码并期望输出为:

checks = [[2,6,10,9], [3,7,8]]

相反,输出结果是:

checks = [[2,6,10,9], [3,7,8], [5]]

代码:

while 0 in checks:
    checks.remove(0)
    
for x in checks:
    if len(x) < 2:
        checks.remove(x)
        
print(checks)

为什么我的代码没有从给定列表中删除单个元素列表 [5]?我在许多 IDE 上运行了这段代码,但结果是一样的。是 Python 的一些缺陷还是我错过了一些关键概念?如果有人能解释 Python 的这种行为并给出解决方法,那将非常有帮助。

【问题讨论】:

  • 在迭代列表时不要从列表中删除项目(就像您在 for 循环中一样)
  • @Aman Sharma,在for loop 中,当您删除项目时,不仅项目会被删除,而且您的列表也会随之更新。但是x 会为每个新的迭代迭代下一个索引,即它下次不会检查相同的索引。

标签: python list


【解决方案1】:

在使用for 循环迭代列表时,不应从列表中删除项目。您可以使用 while 循环和您操作的显式索引变量来实现您想要的:

i = 0
while i < len(checks):
    if len(checks[i]) < 2:
        checks.pop(i)
    else:
        i += 1

【讨论】:

    【解决方案2】:

    您可以使用list comprehension。正如@alaniwi 建议的那样,在列表的 for 循环中操作列表可能不是一个好主意。

    checks =[[1], [2, 6, 10, 9], [3, 7, 8], [4], [5], 0, 0, 0, 0, 0, [11]]
    
    while 0 in checks:
        checks.remove(0)
    
    checks = [x for x in checks if len(x) >= 2]
    
    print(checks)
    

    【讨论】:

      【解决方案3】:

      这是python的一种缺陷。迭代列表或字典或任何容器时,不应对其进行迭代。

      简单的解决方法是将for x in checks: 更改为for x in list(checks): 以创建列表的副本(仅容器,不是内容,因此操作非常便宜)。

      【讨论】:

        【解决方案4】:

        这是因为remove() 接受了一个索引。 我通过列表理解实现了这一点。

        checks =[[1], [2, 6, 10, 9], [3, 7, 8], [4], [5], 0, 0, 0, 0, 0, [11]]
        
        while 0 in checks:
            checks.remove(0)
            
        checks = [x for x in checks if len(x) > 1]
        
        print(checks)
        

        【讨论】:

        • 看起来 Hyun Hwan Jeong 也做过类似的事情。我在登录时遇到了一些问题,所以我的答案显示得很晚。
        猜你喜欢
        • 2011-03-22
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        相关资源
        最近更新 更多