首页 > 解决方案 > Python 列表范围访问作为环形缓冲区

问题描述

我有一个 Python 列表,并且想构建范围循环列表。它看起来像一个环形缓冲区。所以,如果我有一个清单:

[[0], [1], [2], [3]]

我想得到:

[[0], [1], [2], [3]]
[[1], [2], [3], [4]]
[[2], [3], [4], [0]]
[[3], [4], [0], [1]]
[[4], [0], [1], [2]]

我可以自己做。但是在 Python 3 中有没有更好或更聪明的方法呢?

我试过的代码:

N = 5
d_list = [[_] for _ in range(N)]
for i in range(N):
    b1 = i
    e1 = i + N - 1
    b2, e2 = 0, 0
    if e1 >= N:
        e2 = e1 - N
    print(d_list[b1:e1] + d_list[b2:e2])

标签: pythonpython-3.x

解决方案


使用collections.dequeandrotate怎么样?

import collections

N = 5

d = collections.deque(range(N))
for _ in range(N):
    print(d)
    d.rotate(1)

结果:

deque([0, 1, 2, 3, 4])
deque([4, 0, 1, 2, 3])
deque([3, 4, 0, 1, 2])
deque([2, 3, 4, 0, 1])
deque([1, 2, 3, 4, 0])

rotate只是更改列表的开头,没有数据被复制/移动,所以它非常快。

笔记:

  • list如果需要,您可以转换为
  • 我的例子是使用整数,而不是包含一个唯一整数的列表。如有必要,这可以很容易地进行调整。

推荐阅读