【问题标题】:Python: Removing the element in a list while looping the list [duplicate]Python:在循环列表时删除列表中的元素[重复]
【发布时间】:2018-04-02 02:54:18
【问题描述】:

这是一个简单的问题。我的任务是循环一个列表并打印它的每个元素。每次打印后,我也打算从列表中删除这个元素。我的代码是:

>> a = [1,2]
>> for x in a:
>>   print x
>>   a.remove(x)
>>   print a

输出是:

>> 1
>> [2]

然而,这里发生了一些奇怪的事情: 只打印了 1,似乎从列表中删除 1 后,程序直接跳出循环。我的假设是更改列表内容后,迭代器也可能受到影响,但我不太确定。更安全的方法是:

>> a = [1,2]
>> b = list(a)
>> for x in b:
>>   print x
>>   a.remove(x)
>>   print a

谁能给我更高级的解释?

【问题讨论】:

  • 迭代器跟踪位置,是的。但是你为什么要费心删除每个元素呢?你最终会得到一个空列表。
  • b = list(a) 创建列表的副本,因此 a 和 b 成为不同的对象。 This 可能有用。
  • This answer 有一个不错的解释。
  • 如果您想在修改列表时对其进行迭代,请使用while 循环或为for 循环复制列表。
  • 可视化您的代码 - codeskulptor.org/viz

标签: python list


【解决方案1】:
a = [1,2]
while a:
    print a.pop(0)
    print a

【讨论】:

    【解决方案2】:

    您不应从使用for 迭代的列表中删除元素。

    您的猜测很接近——如果您使用更长的列表,您可以更清楚地看到正在发生的事情:

    a = [1,2,3,4,5]
    for x in a:
        print x
        a.remove(x)
        print a
    

    输出:

    1
    [2, 3, 4, 5]
    3
    [2, 4, 5]
    5
    [2, 4]
    

    它打印索引 0 处的元素,然后是索引 1,然后是索引 2...,然后就没有索引 3。

    在您的示例中,它打印索引 1 处的元素,然后没有索引 2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2021-11-28
      • 2017-02-08
      • 2012-05-26
      相关资源
      最近更新 更多