我正在尝试迭代numList并删除小于8(目标)的所有值。 2& 2 5正确删除但3& 7不是。
numList = [2, 3, 5, 7, 11, 13, 17, 19]
for n in numList:
print('Testing: {}'.format(n))
if n < 8:
print('-----REMOVING: {}'.format(n))
numList.remove(n)
预期成果:
测试:2
-----拆除:2
测试:3
-----拆除:3
测试:5
-----拆除:5
测试:7
-----拆除:7
测试:11
测试:13
测试:17
测试:19
期待:[11,13,17,19]
实际结果
测试:2
-----拆除:2
测试:5
-----拆除:5
测试:11
测试:13
测试:17
测试:19
实际:[3,7,11,13,17,19]
答案 0 :(得分:1)
这是因为您要从正在迭代的list
中删除。
您需要首先对<{1}} 进行复制 ,然后重复:
list
给出:
numList = [2, 3, 5, 7, 11, 13, 17, 19]
for n in numList[:]:
print('Testing: {}'.format(n))
if n < 8:
print('-----REMOVING: {}'.format(n))
numList.remove(n)
请注意,使用Testing: 2
-----REMOVING: 2
Testing: 3
-----REMOVING: 3
Testing: 5
-----REMOVING: 5
Testing: 7
-----REMOVING: 7
Testing: 11
Testing: 13
Testing: 17
Testing: 19
:
list-comprehension
给出:
numList = [n for n in numList if n >= 8]
答案 1 :(得分:1)
Python首先创建一个循环索引列表,然后像C中的for循环一样循环,但是在循环时从列表中删除项目。
你的列表中有8个项目要启动,所以想象python在内部决定它将循环8次,并且每次它都会访问列表中的元素“i”。
[2, 3, 5, 7, 11, 13, 17, 19]
首先它访问第一个元素(即2)。 然后你删除2,所以列表现在看起来像
[3, 5, 7, 11, 13, 17, 19]
现在它访问第二个元素(即5)。
当你编写代码时,你可能已经预料到第二个元素在循环时总是被认为是“3”。
有几种方法可以解决这个问题。从python角度来看,一种很好的方法是使用列表推导语法:
numList = [n for n in numList if n >= 8]
如果您愿意,您不必在此处覆盖numList,您可以将等号的右侧分配给新的列表名称。
答案 2 :(得分:0)
永远不要更改迭代列表的大小。 最好列出一个新列表:
>>> numList = [2, 3, 5, 7, 11, 13, 17, 19]
>>> [x for x in numList if x >= 8]
[11, 13, 17, 19]