2016-12-18 11 views
0

私はDFSを使用してすべての置換を印刷しますが、私は小さいpythonicを持っています 間違いw.r.t. fooからの戻り値DFSは文字列のすべての順列をPythonで印刷します

キー '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)]) 

基本的に私は余分なコードの最後の2行を使いたくありません。

答えて

1

return outputの代わりに、return [output]を実行して、収集した数値をそれぞれのリストに入れてください。その後、result +=を実行すると、個々の数字は追加されず、リストが表示されます。

ディクショナリの使用はあまりにも複雑で、各キーには1以外のすべての値が含まれているため、最初のレベルにはメリットがあります。したがって、1を除くすべての値を繰り返します。利得。

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) 
:別に何をしたいのため itertools has methods、あなたは値がまだ選択のために利用可能であるかを追跡するために setを使用することができたという事実から

関連する問題