Python生成器不能转换为列表

2024-04-19 19:16:47 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,我需要得到整数列表的排列。我用了一个生成函数,它似乎得到了正确的结果。然后我尝试将迭代器转换为一个列表。但是,该列表不按顺序返回排列。我不知道有没有办法纠正它。谢谢。你知道吗

def permu(arr, start = 0):
    if start == len(arr):
        yield arr
    for i in range(start, len(arr)):
        arr[start], arr[i] = arr[i], arr[start]
        for x in permu(arr, start + 1):
            yield x
        arr[start], arr[i] = arr[i], arr[start]

def wrapper(arr):
    return list(permu(arr))

if __name__ == "__main__":
    for p in permu([1, 2 ,3]):
        print p

    print wrapper([1, 2, 3])

结果就像——

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]

[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

Tags: 函数in列表forlenif顺序def
1条回答
网友
1楼 · 发布于 2024-04-19 19:16:47

您正在共享一个列表对象,并且只更改内容。wrapper()返回一个列表,其中有6个引用指向该列表:

>>> res = wrapper([1, 2, 3])
>>> res[0] is res[1]
True
>>> res[0] is res[2]
True
>>> res[0][0] = 42
>>> res
[[42, 2, 3], [42, 2, 3], [42, 2, 3], [42, 2, 3], [42, 2, 3], [42, 2, 3]]

您可以生成副本:

def permu(arr, start = 0):
    if start == len(arr):
        yield arr[:]
    for i in range(start, len(arr)):
        arr[start], arr[i] = arr[i], arr[start]
        for x in permu(arr, start + 1):
            yield x
        arr[start], arr[i] = arr[i], arr[start]

或者可以使用^{}

>>> from itertools import permutations
>>> print list(permutations([1, 2, 3]))
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

相关问题 更多 >