【问题标题】:list.remove() isn't removing all instances [duplicate]list.remove() 没有删除所有实例[重复]
【发布时间】:2020-02-02 20:41:52
【问题描述】:

我在列表方面面临着相当奇怪的情况。在这种情况下,Python 似乎对删除哪些零非常有选择性:

count = 0
a = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]

for x in a:
    if x == 0:
        a.remove(x)
        count += 1

print(a, count)

10 个零中只有 6 个被删除。为什么?

【问题讨论】:

  • 请始终对所有 python 问题使用通用 [python] 标签

标签: python python-3.x list


【解决方案1】:
x = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]

list(filter(lambda a: a != 0, x))

输出

['a', 'b', None, 'c', 'd', 1, 1, 3, [], 1, 9, {}, 9]

【讨论】:

    【解决方案2】:

    更好的解决方案是创建一个不包含 0 的新列表:

    b = [x for x in a if x != 0]
    count = len(a) - len(b)
    

    【讨论】:

      【解决方案3】:

      要解决 cmets 中的人描述的问题,您可以执行以下操作:

      count = 0
      a = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]
      for x in a.copy():
          if x == 0:
              a.remove(x)
              count += 1
      print(a, count)
      

      然后您将遍历原始的a,同时在遇到它时将其减少0

      警告:

      >>> False == 0
      True
      

      【讨论】:

      • 所以我需要制作一个重复的列表以便即时修改。
      • 正确,如果它“正在使用中”——你仍然想迭代它,同时改变它——那么是的——你需要复制它
      • @mr_incredible:另一种选择是倒退。但是复制或重新创建它会更快、更易读、更不容易出错。
      猜你喜欢
      • 2014-10-06
      • 1970-01-01
      • 2012-07-26
      • 2019-10-16
      • 2021-05-13
      • 2021-11-03
      • 2011-06-17
      • 2013-03-16
      • 1970-01-01
      相关资源
      最近更新 更多