如何在“每次”迭代期间附加列表时保持列表的长度不变
Posted
技术标签:
【中文标题】如何在“每次”迭代期间附加列表时保持列表的长度不变【英文标题】:How to keep the length of a list constant while appending to it during 'for each' iteration 【发布时间】:2021-12-14 18:42:56 【问题描述】:有没有办法让列表的长度保持不变,同时在迭代过程中不断地追加它?
我尝试了双端队列,但它给了我一个运行时错误,我读到它不可能 leftpop 元素。
我用 list.pop(0) 和 list.append() 尝试过,但索引搞砸了。
双端队列方法将是完美的,指定一个最大长度,然后只有一个“滚动窗口”,如果需要稍后重做,将在其中添加 slice_items,并且开头的项目会弹出以不会耗尽内存。基本上它可以永远运行,直到工作完成,没有新元素被添加回来,列表被耗尽
for symbol in symbols:
slices = ['year1month1', 'year1month2', 'year1month3', 'year1month4']
for slice_item in slices:
# do something here
if something didnt work:
slices.pop(0)
slices.append(slice)
...
这是我的运行时错误方法:
for symbol in symbols:
slices = deque(['year1month1', 'year1month2', 'year1month3', 'year1month4'],maxlen=24)
for slice_item in slices:
# do something here
if something didnt work:
slices.append(slice)
...
更新,感谢@Buran;为了完整性:
from collections import deque
symbols = ('a','b','...','n')
slices = ('year1month1', 'year1month2', 'year1month3')
for symbol in symbols:
slice_queue = deque(range(len(slices)))
while slice_queue:
slice_idx = slice_queue[0]
# do something
done = symbols + slices[slice_idx]
if done:
slice_queue.popleft()
else:
slice_queue.rotate(-1)
【问题讨论】:
您在问题中提到的deque
有什么问题?看collections.deque
根据geeksforgeeks.org/deque-in-python,您可以在deque
s 上使用popleft()
@Einliterflasche,不需要,他们可以设置maxlen
问题是,当我在 deque 上离开时,我得到: RuntimeError: deque mutated during iteration
值得一提的是,您在迭代列表时不应更改列表。看看***.com/questions/1207406/…
【参考方案1】:
编辑:再次阅读您的问题后,我想我错了,但无论如何我会保留我原来的答案,请看最后。
看看collections.deque。我认为您需要旋转双端队列,而不是 maxlen。这样你就创建了一个队列,最后发送失败的任务。
from collections import deque
from random import choice
success = [True, False]
deq = deque(range(5))
while deq:
if choice(success): # for the example randomly choose result of operation
num = deq.popleft()
print(f'Success: num')
else:
print(f'Fail: deq[0]')
deq.rotate(-1) # rotate the deque to left
print(deq)
样本输出:
Fail: 0
deque([1, 2, 3, 4, 0])
Fail: 1
deque([2, 3, 4, 0, 1])
Fail: 2
deque([3, 4, 0, 1, 2])
Fail: 3
deque([4, 0, 1, 2, 3])
Success: 4
Fail: 0
deque([1, 2, 3, 0])
Success: 1
Success: 2
Fail: 3
deque([0, 3])
Fail: 0
deque([3, 0])
Success: 3
Success: 0
我原来的回答:
查看collections.deque 并设置maxlen
来自文档:
如果 maxlen 未指定或为
None
,则双端队列可能会增长到 任意长度。否则,双端队列绑定到指定的 最大长度。一旦有界长度的双端队列已满,当新项目 被添加,相应数量的项目被从 另一端。有界长度双端队列提供的功能类似于 Unix 中的尾部过滤器。它们也可用于跟踪 只有最新的交易和其他数据池 活动很有趣。
例子
from collections import deque
deq = deque(maxlen=3)
for num in range(10):
deq.append(num)
print(deq)
输出
deque([7, 8, 9], maxlen=3)
【讨论】:
以上是关于如何在“每次”迭代期间附加列表时保持列表的长度不变的主要内容,如果未能解决你的问题,请参考以下文章