Python列表范围访问作为环形缓冲区
我有一个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 _
[[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
只更改列表的开头,不复制/移动数据,因此速度非常快
注:
- 如果需要,您可以转换为
列表
- 我的例子是使用整数,而不是包含一个唯一整数的列表。如有必要,这可以很容易地进行调整
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))