Iterating over the elements of a list and perform 'list.remove(x)', but the list is not empty after the iteration
本问题已经有最佳答案,请猛点这里访问。
1 2 3 4 5 | a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579] b = a for i in b: a.remove(i) print(a) |
输出是[3,5,12,17,4321,13579]而不是预期的空列表,为什么是这样?
实际上,我想编写一个程序来删除列表中至少有一个偶数位的所有整数,也就是说。
1 2 3 4 5 6 | a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579] b = a for i in b: if str(j) == 0 or str(j) == 2 or str(j) == 4 or str(j) == 6 or str(j) == 8: a.remove(i) print(a) |
号
但这并不符合预期。我应该如何调试它?
问题是,每次删除一个元素时,都会缩短列表的长度,但保持循环中的位置不变。本质上,当在这样的循环中移除时,跳过其他元素。以
如何通过过滤列表理解来修复它。下面是一个例子:
1 2 | a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579] filtered = [x for x in a if not any(digit in str(x) for digit in '02468')] |
。
在迭代集合时修改集合(尤其是修改长度的操作)是一个"否"。在移除元素时,从脚底拉出地毯。
如果你倒着做,它会起作用:
1 2 3 | for i in reversed(b): a.remove(i) print(a) |
通过列表迭代而不是删除元素不是一件好事:
所以
1 2 3 4 5 | a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579] b = a for i in b: a.remove(i) print(a) |
另外,btw
1 | b=a[:] |
号
或:
1 | b=a.copy() |
要解决此问题,请执行以下操作:
1 2 3 4 5 | a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579] b = a[:] for i in b[:]: a.remove(i) print(a) |
。
或:
1 2 3 4 5 | a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579] b = a[:] while len(a): a.pop() print(a) |
请参见:如何克隆或复制列表?
以及:如何在Python的for循环中删除list元素?
也要回答Do:
1 | print([i for i in a any(i.__contains__(x) for x in range(0,10,2))]) |
。