【问题标题】:How does list() fix the problem of deleting elements in a list while iterating over them? [duplicate]list() 如何解决在迭代列表中删除元素的问题? [复制]
【发布时间】:2021-07-23 22:31:52
【问题描述】:

我正在处理一个列表,我注意到了一些东西。

例如,这段代码在循环遍历列表时从列表中删除奇数。

numbers=[x for x in range (100)]
for nb in numbers:
    if nb%2 == 1:
        del numbers[numbers.index(nb)]

当您添加一个计数器以查看您获得的总迭代次数时:

numbers=[x for x in range (100)]
counter=0
for nb in numbers:
    if nb%2 == 1:
        del numbers[numbers.index(nb)]
    counter +=1

结果是计数器 = 51。

但是,如果在 for 循环中添加运算符 list()

numbers=[x for x in range (100)]
counter=0
for nb in list(numbers):
    if nb%2 == 1:
        del numbers[numbers.index(nb)]
    counter +=1

这次的结果是 counter = 100。

我想知道这里操作员list()的作用和作用是什么。

注意:如果您打印 numberslist(numbers),它们是相同的。

【问题讨论】:

  • 这能回答你的问题吗? How to remove items from a list while iterating?
  • 在第一种情况下,您在迭代列表时正在修改列表,这是一种不好的做法,会导致您观察到的奇怪行为。在第二种情况下,您正在迭代列表的副本,然后修改原始列表。这很好,可以产生您期望的结果。

标签: python list loops


【解决方案1】:

您的第二个示例制作了列表的副本。您遍历该副本,无论您在此期间对numbers 做什么,它都保持在 100 个元素。

您的第一个示例会在您遍历列表时更改列表,这是一个有据可查且广为人知的bad idea。如果您在每次迭代中打印nb 的列表和当前值,您将看到进度是如何工作的。一个简单的观点是 Python 解释器按索引(位置)遍历列表;当您缩短列表时,所有内容都会向下移动一个位置,但该索引仍会增加,因此会跳过一项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 2013-01-23
    • 2011-07-13
    • 2018-07-18
    • 2016-11-21
    • 2011-01-27
    • 2016-07-19
    • 2010-12-07
    相关资源
    最近更新 更多