【问题标题】:Deleting items from list while iterating over it [duplicate]在迭代列表时从列表中删除项目[重复]
【发布时间】:2015-09-08 15:40:10
【问题描述】:

我正在尝试使用项目迭代列表。处理该项目后,我想删除该项目并将列表写入文件。但是有一个问题是只删除偶数位置的项目。

这是一个非常简单的例子:

>>> x = [1,2,3,4,5,6,7,8,9]
>>> for i in x:
...     print x
...     x.remove(i)
...     write_x_into_the_file()
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4, 5, 6, 7, 8, 9]
[2, 4, 5, 6, 7, 8, 9]
[2, 4, 6, 7, 8, 9]
[2, 4, 6, 8, 9]

我认为这是因为它使用索引递增进行迭代。你知道一些pythonic的解决方法吗?

【问题讨论】:

  • 真正想要达到什么目的?
  • 这些项目是真实的网址。我想对所有这些 url 做一些事情(以获取一些数据)。但有时,会出现连接中断或类似问题的情况。为了能够从出现问题的 url 继续,我必须将它们保存到文件中。
  • 那么为什么在迭代时需要从列表中删除项目?
  • 首先要找到所有的url。这些 url 被写入文件中。下一步是处理每个 url,以便一个接一个地加载和处理这些 url。处理 url 时,它会从列表中删除,因为我不想处理它两次并保存列表,因此如果连接出现问题,脚本知道从哪里开始。
  • 顺序重要吗?你能每个人都pop 吗?

标签: python list loops iteration


【解决方案1】:
x = [1,2,3,4,5,6,7,8,9][::-1]
while len(x):
    ele = x.pop() # equv to ordinary for loop

x = [1,2,3,4,5,6,7,8,9]
while len(x):
    ele = x.pop() # reversed loop

【讨论】:

    【解决方案2】:

    您可以跟踪所有需要删除的索引并在之后删除它们

    delete = []
    my_list = [1,2,3,4,5,6,7,8,9]
    for i, x in enumerate(my_list):
        write_x_into_the_file()
        delete.append(i)
    
    for d in delete:
        del my_list[d]
    

    【讨论】:

    • 这有完全相同的问题,当您删除内容时,索引会发生变化!
    猜你喜欢
    • 2011-11-26
    • 2020-05-27
    • 2014-10-26
    • 2017-09-17
    • 1970-01-01
    • 2022-05-17
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多