【问题标题】:Append to List while Iterating迭代时追加到列表
【发布时间】:2013-02-17 00:24:01
【问题描述】:

我需要这种行为,但宁愿减少列表而不是增加列表。 顺序对于此操作很重要。

for item in mylist:
    if is_item_mature(item):
        ## Process him
    else:
        ## Check again later
        mylist.append(item)

但我宁愿让它更像这样。这和我想的一样吗?还有更好的方法吗?

while mylist:
    item = list.pop(0)
    if is_item_mature(item):
        ##Process
    else:
        mylist.append(item)

【问题讨论】:

  • 是的,它看起来就像你想象的那样。但它是否像您预期的那样工作?
  • list 不是变量名的好选择。
  • 一切似乎都很好,只有打嗝是最后一些项目的死锁(我的部分数据集有误)。调试器发现队列在追尾。

标签: python list iteration


【解决方案1】:

我看到你的方法的唯一问题是一个不断增长的列表,根据你的使用情况可能会占用你的内存

我宁愿建议您使用Queue。队列的设计和灵活性足以处理结束的生产和消费

from Queue import Queue
q = Queue() #You can also specify the maximum size of the Queue here
# Assume your Queue was filled
while not q.empty():
    # It won;t block if there are no items to pop
    item = q.get(block = False) 
    if is_item_mature(item):
        #process
    else:
        #In case your Queue has a maxsize, consider making it non blocking
        q.put(item) 

【讨论】:

  • 我想我也喜欢这个。目前我的循环处理有点粗糙,严格的排序暂时让我免于一些额外的代码。
  • Queue.Queue 用于多线程。如果你不需要这个,就使用collections.deque,这是Queue内部使用的。
【解决方案2】:

您可以安全地将项目附加到列表中,并且迭代将包括这些项目:

>>> lst = range(5)
>>> for i in lst:
...     print i
...     if i < 3:
...         lst.append(i + 10)
... 
0
1
2
3
4
10
11
12

但是,如果您更喜欢递减列表,那么您的 while 循环非常适合您的需求。

【讨论】:

  • 你怎么知道这是安全的并且可以这样工作?这在某处有记录吗?很长一段时间以来,我一直在努力寻找一些证据......
  • @StefanPochmann:我怎么知道?列表和列表迭代器实现细节的经验和知识。它没有明确记录。
  • @StefanPochmann:iter(list) 返回的列表迭代器存储当前位置(整数)和对列表的引用。每次获取下一个元素时,都会根据当前列表大小检查当前位置,如果小于则从列表中检索当前位置的项,位置递增,并返回检索到的项。跨度>
  • @StefanPochmann:这样可以安全地扩展或缩小列表;每次都测试长度。无论中间列表发生了什么,位置都会增加,这就是为什么在当前位置或之前删除元素通常是一个坏主意(内容移动但当前位置没有相应调整)。
  • 谢谢。虽然那是我已经知道/怀疑的。最近我什至在for x in a 循环中使用了它,我想在某些x 值之后“跳过”下一个元素,所以对于这些值我称之为a.pop(0)。但那是因为我目前编码只是为了好玩。我不会在严肃的代码中使用它甚至“在迭代期间附加”,因为我不能相信它。我发现迭代器在创建它时查找并存储列表大小,或者在检索项目之后根据大小检查索引,或者做一些其他意想不到的事情是可以想象的。据我所知,我...
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2020-09-24
  • 2019-09-06
  • 2013-09-16
相关资源
最近更新 更多