我没有设法纠正我认为可行的代码。任何使代码具有功能的建议都被接受。 以下代码的预期输出是包含列表的循环置换的列表
l = [1,2,3,4] (i.e : [[4, 1, 2, 3],[3, 4, 1, 2],[2, 3, 4, 1],[1, 2, 3, 4]])
虽然我得到的是:[[2,3,4,1]]
代码:
def cycGen(l):
L=[]
while not(l in L) :
L.append(l)
for i in range(len(l)):
if l[i] == len(l) :
l[i]=1
else :
l[i] = 1 + l[i]
return L
print(cycGen([1,2,3,4]))
该解决方案的另一个变体是考虑以下代码,但似乎不幸的是:
def cycGen(l):
L=[]
for k in range(len(l)):
L.append(l)
for i in range(len(l)):
if l[i] == len(l) :
l[i]=1
else :
l[i] = 1 + l[i]
return L
请帮助我分享您慷慨的知识。
答案 0 :(得分:3)
您可以使用collections.deque
:
from collections import deque
a = [1, 2, 3, 4]
d = deque(a)
for _ in range(len(a)):
d.rotate()
print(list(d))
它为您提供输出:
[4, 1, 2, 3]
[3, 4, 1, 2]
[2, 3, 4, 1]
[1, 2, 3, 4]
中所述
答案 1 :(得分:1)
一个简单的方法就是:
In [12]: x = [1,2,3,4]
In [13]: [x[i:]+x[:i] for i in range(len(x))]
Out[13]: [[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]
答案 2 :(得分:0)
在您的第一个代码示例中,行L.append(l)
将{引用'(松散地说)添加到列表l
到L
的末尾,而不是在您附加副本似乎在期待。因此,稍后修改l
时,L
中对其的引用也会被修改,因此在测试l in L
时,l
将等于对自身的引用在L
中,循环结束。相同的基本问题会导致您的第二个代码示例返回相同列表的多个而不是几个不同的列表。
要在l
中的当前时间点存储L
的副本,请使用L.append(l[:])
。
答案 3 :(得分:0)
这是一个简单的方法:
>>> def cycGen(l):
size = len(l)
return [[l[(i+j)%size] for i in range(size)] for j in range(size)]
>>> l = [1,2,3,4]
>>> print cycGen(l)
[[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]
答案 4 :(得分:0)
您也可以使用生成器执行此操作:
a = [1, 2, 3, 4]
def next_pos(max):
i = 0
while True:
for n in xrange(max):
yield n + i
i += 1
pos = next_pos(len(a))
b = []
for i in xrange(len(a)):
n = []
for j in xrange(len(a)):
m = pos.next()
if m >= len(a):
m -= len(a)
n.append(a[m])
b.append(n)
print b
输出:
[[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]