2

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

我正在尝试迭代 numList 并删除所有小于 8 的值(目标)。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 ]

4

3 回答 3

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,您可以将等号的右侧分配给新的列表名称。

于 2017-12-11T19:41:49.427 回答
1

list这是因为您要从您正在迭代的 a 中删除。

您需要制作第一个副本,然后对其进行迭代: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

请注意,使用 a 更像 Pythonic list-comprehension

numList = [n for n in numList if n >= 8]

这使:

[11, 13, 17, 19]
于 2017-12-11T19:30:47.843 回答
0

永远不要改变你迭代的列表的大小。最好做一个新的清单:

>>> numList = [2, 3, 5, 7, 11, 13, 17, 19]
>>> [x for x in numList if x >= 8]
[11, 13, 17, 19]
于 2017-12-11T19:32:46.777 回答