2017-08-17 8 views
3

別のものを要約する辞書を作成しようとしています。 summary_dictは、キーがdetails_dictの「親」の値と一致する場合にのみ更新されるようにしたいと思います。私が書いたことは、私が期待するようにsummary_dictにアクセスしていないようです。 printステートメントは、summary_dictから適切な値を取得するのではなく、ループ内の最初のiterableに追加し続けることを示しています。Python辞書がループ内で予想通りに更新されない

detail_dict = {'a123': {"data": [1, 2, 3, 4], "parent": "a"}, 
       'a124': {"data": [1, 2, 3, 4, 5], "parent": "a"}, 
       'b123': {"data": [1, 2, 3], "parent": "b"}, 
       'b124': {"data": [1], "parent": "b"}} 

summary_dict = dict.fromkeys(["a", "b"], {"data": [], 
              "data_len": []}) 

for k, v in detail_dict.iteritems(): 
    summary_dict[v['parent']]["data"].append(v["data"]) 
    summary_dict[v['parent']]["data_len"].append(len(v["data"])) 
    print "\nMy value is " 
    print v 
    print "\nMy summary dictionary now looks like:" 
    print summary_dict[v['parent']] 

私が望む結果の辞書です:

{"a": {"data": [[1, 2, 3, 4], [1, 2, 3, 4, 5]], 
     "data_len": [4, 5]}, 
"b": {"data": [[1, 2, 3], [1]], 
     "data_len": [3, 1]}} 

答えて

5

あなたはfrom_keysに変更可能なパラメータを渡しているので、参照がキーの間にコピーされます。

各キーのために1つの別個のREFを作成する代わりに、このようなあなたの辞書を作成します。

{'a': {'data_len': [5, 4], 'data': [[1, 2, 3, 4, 5], [1, 2, 3, 4]]}, 'b': {'data_len': [3, 1], 'data': [[1, 2, 3], [1]]}} 

あなたは:辞書の順序が保証されないよう、あなたのような何かを得ること

summary_dict = {x : {"data": [],"data_len": []} for x in ["a","b"]} 

ノートリスト内の順序が確定的であるようにアイテムをソートするには

を使用することができます。

+0

感謝を!私は自分自身でその罠を解決したことはありませんでした。私はそれが私がループでそれを呼んでいた方法であると確信していたと思った – LoveMeow

5

dict.fromkeysメソッドは、同じインスタンスを各値に使用します。

summary_dict = dict.fromkeys(["a", "b"], {"data": [], "data_len": []}) 

1つのキーの辞書を変更すると、すべてのキーに影響します。このトラップを回避するには、デフォルト値には不変オブジェクトのみを使用することをお勧めします(dict.fromkeys)。

代わりにこの辞書の理解を試してみてください:そんなに

summary_dict = {k: {"data": [], "data_len": []} for k in 'ab') 
関連する問題