迭代列表但跳过一些值...?

时间:2017-12-11 19:27:32

标签: python-3.x list iteration remove-method

迭代列表以删除小于目标的值

我正在尝试迭代numList并删除小于8(目标)的所有值。 2& 2 5正确删除但3& 7不是。

  • 绝对是删除方法。如果numList.remove(n)注释掉,则程序打印语句可以正确运行。
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]

3 个答案:

答案 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

更加Pythonic
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]