, 당신은 정기적으로 사전에 종료됩니다 : 모두 사전 정확히 같은 공유하는 경우
data3 = {k1: dict(Counter(v1) + Counter(v2)) for (k1, v1), (k2, v2) in
zip(data1.items(), data2.items())}
이 뜻은, 그러나, 제대로 작동 키를 사용합니다. Willem Van Onsem의 솔루션은 두 사전 모두에서 공유되지 않는 키가있는 경우 작동하지 않습니다 (Max Chrétiens의 솔루션은 항목을 잘못 병합하는 반면 오류가 발생합니다). 이제는 비슷한 구조의 키가있는 JSON 데이터를 사용한다고 언급 했으므로 문제가되지 않아야하며 Max Chrétien의 솔루션이 제대로 작동해야합니다.
두 사전 (및 해당 하위)에서 공유하는 키만 사용하려면 다음이 작동해야합니다. "X"를 어떻게 추가했는지 확인하십시오. 2012 년 하위 사전과 {1999 년}의 키 값 쌍인 111111 : 전체 하위 사전으로 { '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
참조 크리스탈의 솔루션 이미 쓴해서, 비공유 키/값을 유지
길고 부풀어 버전은 ... 지금까지 게시 된 가장 간결하고 기능적인 해결책이 될 수 있습니다.
두 사전의 구조가 동일하게 보장 되나요? –