在python问题中生成列表的排列

在python问题中生成列表的排列,python,Python,下面是我编写的代码,用于从列表生成所有排列 def perm(arr): if len(arr)==1: return (arr) if len(arr)==0: return ([]) else: result=[] for i in range(len(arr)): x=arr[i] xs=arr[:i]+arr[i+1:] for

下面是我编写的代码,用于从列表生成所有排列

def perm(arr):
    if len(arr)==1:
        return (arr)
    if len(arr)==0:
        return ([])
    else:
        result=[]
        for i in range(len(arr)):
            x=arr[i]
            xs=arr[:i]+arr[i+1:]
            for p in perm(xs):
                result.append([x]+p)
    return (result)

perm(['a', 'b', 'c'])
我得到了以下错误:

TypeError: can only concatenate list (not "str") to list
我花了很长时间想弄清楚原因,但我弄不明白。有人能帮助解释为什么上面的代码会给出这些错误吗?先谢谢你

您可以使用

你的代码很好,只是一个小补丁

result.append([x] + [i for i in p])

如果只使用
str
s而不是列表,代码可能会更干净:

def perm(arr):
    if len(arr) == 1:
        return arr
    if len(arr) == 0:
        return ""
    else:
        result = ""
        for i in range(len(arr)):
            x = arr[i]
            xs = arr[:i] + arr[i + 1:]
            for p in perm(xs):
                result.append(x + p)
    return result


print perm('abc')
['abc','acb','bac','bca','cab','cba']

这也解决了附加子问题解决方案时的错误。

问题在于:

if len(arr)==1:
    return (arr)
只有一个值的列表只有一个排列-列表本身。但是你的函数应该返回一个排列列表——换句话说,一个列表列表——因此你必须将它包装在另一个列表中:

if len(arr)==1:
    return [arr]
在更改之前,单元素输入的结果不是排列列表,它只是一个值列表:

>>> perm([1])
[1]
更改后,结果是正确的:

>>> perm([1])
[[1]]

问题在于括号

返回(arr)
将返回
arr
,而不是
[arr]

return[arr]
将解决此问题。
其他括号作为回报也不起任何作用。

你需要这段代码来工作,还是只想得到所有的排列?我试图练习编程,而不是使用现有的工具@Shahaf如果我使用generator,似乎我必须这样做:
yield arr
。我还是有点困惑。。。。你能澄清一下吗@阿兰-Fey@zesla如果看不到你的代码,就不能。你可以/应该就此提出一个新问题。
>>> perm([1])
[[1]]