Python列表范围访问作为环形缓冲区

Python列表范围访问作为环形缓冲区,python,python-3.x,Python,Python 3.x,我有一个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]] 我可以自己做。但是在Python3中有更好或更聪明的方法吗 我尝试过的代码: N = 5 d_list = [[_] for _

我有一个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]]
我可以自己做。但是在Python3中有更好或更聪明的方法吗

我尝试过的代码:

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])

使用
collections.deque
rotate
怎么样

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
只更改列表的开头,不复制/移动数据,因此速度非常快

注:

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

此Python函数可根据需要旋转任何对象:

def rotate(l, y=1):
   if len(l) == 0:
      return l
   y = -y % len(l)     # flip rotation direction
   return l[y:] + l[:y]

>>> rotate([1,2,3,4,5],2)
[4, 5, 1, 2, 3]
>>> rotate([1,2,3,4,5],-22)
[3, 4, 5, 1, 2]
>>> rotate('abcdefg',3)
'efgabcd'
>>> for i in range(N):
...    print(d_list)
...    d_list=rotate(d_list)
... 
[[0], [1], [2], [3], [4]]
[[4], [0], [1], [2], [3]]
[[3], [4], [0], [1], [2]]
[[2], [3], [4], [0], [1]]
[[1], [2], [3], [4], [0]]
请注意,在Python3中,
range
是不可切片的。您首先需要使用
list(范围(…)


符号约定与
deque.rotate

操作相同:如果要旋转列表列表,可以执行
collections.deque([i]表示范围(N)中的i))