3

私は、巨大な木のように、多くのネストされた辞書を持つ巨大な辞書を持っています。深さは不明です。

dict、 value (as string)find_value()を受け取り、 list のリストを返すのような関数が必要です。それぞれが「パス」(最初のキーからキー (またはキー値) までのキーの連続チェーンで、見つかった値があります) )。何も見つからない場合は、空のリストを返します。

私はこのコードを書きました:

def find_value(dict, sought_value, current_path, result):   
    for key,value in dict.items():
        current_path.pop()
        current_path.append(key)
        if sought_value in key:
            result.append(current_path)
        if type(value) == type(''):
            if sought_value in value:
                result.append(current_path+[value])
        else:
            current_path.append(key) 
            result = find_value(value, sought_value, current_path, result)
    current_path.pop()
    return result 

この関数を呼び出してテストします。

result = find_value(self.dump, sought_value, ['START_KEY_FOR_DELETE'], [])
if not len(result):
    print "forgive me, mylord, i'm afraid we didn't find him.."
elif len(result) == 1:
    print "bless gods, for all that we have one match, mylord!"

いくつかの不可解な理由により、この関数の実装はいくつかのテストに失敗します。私はデバッグを開始し、current_pathが正しいものを出力したとしても(常にそうです、チェックしました!)、結果が不可解に破損していることを発見しました。もしかして再帰魔法のせい?

誰でもこの問題を解決できますか? 多分私の仕事のための簡単な解決策はありますか?

4

2 に答える 2

2

を書くときresult.append(current_path)、あなたは をコピーしているのではなくcurrent_path、変化し続けます。に変更しresult.append(current_path[:])ます。

于 2013-04-29T21:01:30.550 に答える