列表的Python排列,存储值,不变异

时间:2018-01-13 00:52:34

标签: python recursion permutation

我很难写出排列。一旦找到新算法,我就会陷入可变性。有没有办法追加到newArray中,但保持旧的价值不变?

或者我应该如何修改它?

newArray = []


def permutations(array):
    if array in newArray:
        return
    for i in range(len(array)):
        array[0], array[i] = array[i], array[0]
        newArray.append(array)
        permutations(array)
    return newArray

2 个答案:

答案 0 :(得分:1)

就像你说的,问题是列表是可变的。因此,解决方案是您必须复制array而不是改变原始版本。看起来应该是这样的:

编辑:更改为反映grovina评论浅层副本就足够了)

newArray = []

def permutations(array):
    if array in newArray:
        return
    for i in range(len(array)):
        array_copy = list(array) # or array[:] or copy.copy(array); they all create copies
        array_copy[0], array_copy[i] = array_copy[i], array_copy[0]
        newArray.append(array_copy)
        permutations(array_copy)
    return newArray

由于您正在修改newArray(因为它是一个列表而变得可变),因此在函数结束时也没有必要将其返回,但是&#39由你决定。

答案 1 :(得分:0)

感谢您的回复,我最终得到了这个:

def permutations(array):
    if len(array) == 0:
        return [[]]
    if len(array) == 1:
        return [array]
    else:
        arr = []
        for i in range(len(array)):
            array[0], array[i] = array[i], array[0]
            start = array[0]
            end = permutations(array[1:])
            for x in end:
                arr.append([start]+x)
    return arr
print(permutations([1, 2]))

输出:[[1,2],[2,1]]

适用于任何输入。