Python:生成循环排列代码(需要澄清的意外代码错误)

时间:2014-07-17 01:07:41

标签: python algorithm python-3.x generator permutation

我没有设法纠正我认为可行的代码。任何使代码具有功能的建议都被接受。 以下代码的预期输出是包含列表的循环置换的列表

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

请帮助我分享您慷慨的知识。

5 个答案:

答案 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]

正如Efficient way to shift a list in python

中所述

答案 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)将{引用'(松散地说)添加到列表lL的末尾,而不是在您附加副本似乎在期待。因此,稍后修改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]]