Python 自动重新排队队列的数据结构

Python data structure for auto-requeueing queue

是否有任何标准库数据结构可用于队列,当项目从末端弹出时自动重新排队到队列的另一端?这感觉像是一个常见问题,所以我想可能有一个简单的数据结构可以做到这一点。

例如:

from collections import deque
from time import sleep

queue = deque([1, 2, 3, 4, 5, 6, 7, 8])

while True:
    item = queue.pop()
    queue.appendleft(item)
    print(item)
    sleep(5)

上面的代码实际上是最优的,还是有更好的方法来解决这个问题?
仅使用列表并在循环的每次迭代中修改索引值以更改访问列表中的哪个位置会更好吗?

你所做的就是轮换。 Deque 将其作为内置函数:deque.rotate(n).

Rotate the deque n steps to the right. If n is negative, rotate to the left.

When the deque is not empty, rotating one step to the right is equivalent to d.appendleft(d.pop()), and rotating one step to the left is equivalent to d.append(d.popleft()).

用法:

>>> from collections import deque
>>> dq = deque()
>>> dq.append(4)
>>> dq.append(5)
>>> dq.append(6)
>>> dq
deque([4, 5, 6])
>>> dq.rotate()
>>> dq
deque([6, 4, 5])
>>> dq.rotate(2)
>>> dq
deque([4, 5, 6])
>>> dq.rotate(-2)
>>> dq
deque([6, 4, 5])

查看

https://docs.python.org/2/library/itertools.html#itertools.cycle

def cycle(iterable):
    # cycle('ABCD') --> A B C D A B C D A B C D ...
    saved = []
    for element in iterable:
        yield element
        saved.append(element)
    while saved:
        for element in saved:
              yield element

这应该可以满足您的需求,而且效率很高。

deque.rotate()

`collections.deque' 可以像列表一样进行索引,并且有旋转方法。

from collections import deque
from time import sleep

queue = deque([1, 2, 3, 4, 5, 6, 7, 8])

while True:
    item = queue[0]
    queue.rotate(1)
    print(item)
    sleep(5)