我正在使用DFS打印所有排列,但我有一个小pythonic 错误w.r.t.从foo返回值。
对于密钥' 1',我希望foo的返回值为[[1,2,3] [1,3,2]],但它目前是[1,2,3] ,1,3,2]。我尝试使用result.append但它没有用。
data = [1, 2, 3]
def foo(key, dict_data, output):
result = []
if len(output) == len(dict_data.keys()):
return output
values = dict_data[key]
for value in values:
if value not in output:
result += foo(value, dict_data, output + [value])
return result
dict_data = {}
for i in range(len(data)):
dict_data[data[i]] = data[0:i] + data[i+1:]
result = []
for key in dict_data.keys():
result += foo(key, dict_data, [key])
for i in range(0, len(result), len(data)):
print(result[i:i+len(data)])
基本上我不想使用我的代码的最后两行,这是多余的。
答案 0 :(得分:1)
而不是return output
您应该return [output]
,以便将收集的数字放在他们自己的列表中。然后当你执行result +=
时,你不会添加单个数字,而是列表,这就是你想要的。
请注意,您对字典的使用过于复杂,只会为第一级带来好处,因为每个键都包含除一个之外的所有值,因此您将迭代除一个之外的所有值,这不是很多获利。
除了itertools
has methods符合您的要求之外,您还可以使用set
来跟踪哪些值仍可供选择:
def foo(set_data, output):
if len(set_data) == 0:
return [output]
result = []
for value in set_data:
result += foo(set_data - set([value]), output + [value])
return result
data = [1, 2, 3]
set_data = set(data)
result = foo(set_data, [])
print(result)