如何在“每次”迭代期间附加列表时保持列表的长度不变

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,您可以在deques 上使用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)

【讨论】:

以上是关于如何在“每次”迭代期间附加列表时保持列表的长度不变的主要内容,如果未能解决你的问题,请参考以下文章

在重复迭代期间更有效的洗牌

从readlines删除行()

VC中如何让列表控件单击不高亮, 双击才高亮, 并且离开列表控件焦点时, 双击的高亮保持不变。

为每个循环附加到一个新列表

Ag-Grid 在与下拉列表交互期间保持自定义过滤器打开

避免在 React 渲染循环中进行每次迭代绑定