あなたは辞書を追加する場合()最大Chrétiens'素敵なショートソリューションには、あなたが通常の辞書で終わるだろうが:
data3 = {k1: dict(Counter(v1) + Counter(v2)) for (k1, v1), (k2, v2) in
zip(data1.items(), data2.items())}
両方の辞書がまったく同じを共有する場合、これは、しかし、唯一の正しく動作しますキーを使用することができます。 Willem Van Onsemのソリューションは、両方の辞書で共有されていないキーがある場合は機能しません(エラーが発生しますが、MaxChrétiensのソリューションはこの場合誤ってアイテムをマージします)。今度は、同じ構造のキーを持つJSONデータを使用していると言いましたので、問題はありません。MaxChrétienのソリューションはうまくいくはずです。
両方のディクショナリ(およびそのサブディクショナリ)で共有されているキーだけが使用されていることを確認したい場合は、次のように動作します。 "X"をどのように追加しましたか:111111を2012サブディクショナリと "1999"のキー値ペアとして:{'Z':999999}をサブディクショナリ全体として追加します。
def sum_two_nested_dicts(d1, d2):
dicts = [d1, d2]
d_sum = {}
for topkey in dicts[0]:
if topkey in dicts[1]:
d_sum[topkey] = {}
for key in dicts[0][topkey]:
if key in dicts[1][topkey]:
new_val = sum([d[topkey][key] for d in dicts])
d_sum[topkey][key] = new_val
return d_sum
data1 = {
"2010": {
'A': 2,
'B': 3,
'C': 5
},
"2011": {
'A': 1,
'B': 2,
'C': 3
},
"2012": {
'A': 1,
'B': 2,
'C': 4,
'X': 111111
},
"1999": {
'Z': 999999
}
}
data2 = {
"2010": {
'A': 4,
'B': 4,
'C': 5
},
"2011": {
'A': 1,
'B': 1,
'C': 3
},
"2012": {
'A': 3,
'B': 2,
'C': 4
}
}
data3 = sum_two_nested_dicts(data1, data2)
print(data3)
# different order of arguments
data4 = sum_two_nested_dicts(data2, data1)
print(data4)
# {'2010': {'C': 10, 'A': 6, 'B': 7}, '2012': {'C': 8, 'A': 4, 'B': 4}, '2011': {'C': 6, 'A': 2, 'B': 3}}
# {'2010': {'C': 10, 'A': 6, 'B': 7}, '2012': {'C': 8, 'A': 4, 'B': 4}, '2011': {'C': 6, 'A': 2, 'B': 3}}
私は、これははるかに可能な限り簡潔かつエレガントからで実現するが、私はすでにとにかくそれを書いたように、私は誰かがこの特定の機能を実現しようとしている場合にはそれをここに投稿してください。私はすでにそれを書いたという理由だけで
ロングおよび非共有キー/値を保持して肥大化したバージョン、...これまで掲載最も簡潔かつ機能的な解決策になると思われるものについて
def sum_nested_dicts(dic1, dic2):
# create list of both dictionaries
dicts = [dic1, dic2]
# create a set of all unique keys from both dictionaries
topkeys = set(sum([list(dic.keys()) for dic in dicts], []))
# this is the merged dictionary to be returned
d_sum = {}
for topkey in topkeys:
# if topkey is shared by both dictionaries
if topkey in dic1 and topkey in dic2:
d_sum[topkey] = {}
keys = set(sum([list(dic[topkey].keys()) for dic in
dicts], []))
for key in keys:
# if key is shared by both subdictionaries
if key in dic1[topkey] and key in dic2[topkey]:
new_val = sum([d[topkey][key] for d in dicts])
d_sum[topkey][key] = new_val
# if key is only contained in one subdictionary
elif key in dic1[topkey]:
d_sum[topkey][key] = dic1[topkey][key]
elif key in dic2[topkey]:
d_sum[topkey][key] = dic2[topkey][key]
# if topkey is only contained in one dictionary
elif topkey in dic1:
d_sum[topkey] = dic1[topkey]
elif topkey in dic2:
d_sum[topkey] = dic2[topkey]
return d_sum
を参照してくださいクリスタルのソリューション。
2つの辞書の構造が同じであることは保証されていますか? –