在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]]