【问题标题】:Iterating over list but some values are skipped...?迭代列表,但某些值被跳过...?
【发布时间】:2018-05-25 09:26:22
【问题描述】:

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

我正在尝试迭代 numList 并删除所有小于 8(目标)的值。 2 和 5 均已正确删除,但 3 和 7 未正确删除。

  • 绝对是remove方法。如果 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]

【问题讨论】:

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


【解决方案1】:

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

您需要制作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 更符合 Pythonic:

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

给出:

[11, 13, 17, 19]

【讨论】:

    【解决方案2】:

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

    >>> numList = [2, 3, 5, 7, 11, 13, 17, 19]
    >>> [x for x in numList if x >= 8]
    [11, 13, 17, 19]
    

    【讨论】:

      【解决方案3】:

      说明

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

      【讨论】:

        猜你喜欢
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多