[英]Merging hierarchy of dictionaries with same keys in Python
我有幾個嵌套字典,其中包含第一級的日期,第二級的國家,以及每個國家的數字列表。
我想合並所有共享相同鍵的列表,即相同的日期和相同的國家要合並在一起並形成最終字典。
例如,其中 3 個字典可能如下所示:
a = {
2018-01-01: {'China': [1,3,5,7,8],
'Japan': [1,2,3,4,5]},
2018-02-01: {'China': [1,2,3,4,5],
'Spain': [1,2,3,4,5]}}
b = {2018-02-01: {'China': [2,4,6,8,10],
'Germany': [1,3,6,9]}}
c = {2018-02-01: {'France': [1,2,3,4,5],
'Spain': [2,3,1,4,5]}}
合並后的列表如下:
merged_list = {
2018-01-01: {'China': [1,3,5,7,8],
'Japan': [1,2,3,4,5]},
2018-02-01: {'Spain': [1,2,3,4,5,2,3,1,4,5],
'China': [1,2,3,4,5,2,4,6,8,10],
'Germany': [1,3,6,9],
'France': [1,2,3,4,5]}}
我不太確定如何 go 關於這個。 我嘗試執行以下操作,但它只是合並日期並覆蓋每個日期內的值:
merged_list = {**a, **b, **c}
returns
{2018-01-01: {'China': [1,3,5,7,8], 'Japan': [1,2,3,4,5]},
2018-02-01: {'France': [1,2,3,4,5], 'Spain': [2,3,1,4,5]}}
以下遞歸 function 將合並這樣的數據結構:
def merge(*dcts):
d = {}
for key in set(k for dct in dcts for k in dct.keys()):
try:
d[key] = sum((dct.get(key, []) for dct in dcts), [])
except TypeError:
d[key] = merge(*(dct.get(key, {}) for dct in dcts))
return d
>>> merge(a, b, c)
{'2018-01-01': {'China': [1, 3, 5, 7, 8],
'Japan': [1, 2, 3, 4, 5]},
'2018-02-01': {'China': [1, 2, 3, 4, 5, 2, 4, 6, 8, 10],
'France': [1, 2, 3, 4, 5],
'Germany': [1, 3, 6, 9],
'Spain': [1, 2, 3, 4, 5, 2, 3, 1, 4, 5]}}
或者,您可以使用collections.defaultdict
使其更具可讀性:
from collections import defaultdict
def merge(*dcts):
d = defaultdict(lambda: defaultdict(list))
for dct in dcts:
for date in dct:
for country in dct[date]:
d[date][country] += dct[date][country]
return d
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.