簡體   English   中英

在 Python 中合並具有相同鍵的字典層次結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM