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



我正在使用DFS打印所有排列,但我有一个小的Pythonic错误W.R.T.从foo返回值。

对于键'1',我希望foo的返回值为[[1,2,3] [1,3,2]],但目前是[1,2,3,1,3,2]。我尝试使用结果。应用程序,但它不起作用。

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

基本上我不想使用多余的代码的最后2行。

而不是 return output,您应该做return [output],以便将收集的数字放在自己的列表中。然后,当您执行result +=时,您将不会添加单个数字,而是列表,这是您想要的。

请注意,您对词典的使用过于复杂,并且仅带来第一级的好处,因为每个键都包含除一个值以外的所有值,因此您将迭代所有值,除一个值外,这不是一个增益,这并不是很多值。

除了itertools具有您想要的方法的事实外,您可以使用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)

最新更新