DFS在python中打印字符串的所有排列

时间:2016-12-18 09:21:25

标签: python algorithm depth-first-search

我正在使用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)])

基本上我不想使用我的代码的最后两行,这是多余的。

1 个答案:

答案 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)