【问题标题】:Merge two dictionaries with nested dictionaries into new one, summing same keys and keeping unaltered ones in Python将两个带有嵌套字典的字典合并到一个新字典中,将相同的键相加并在 Python 中保持不变的键
【发布时间】:2015-06-24 05:16:59
【问题描述】:

我有两个字典,都有一个嵌套字典,我想将它们合并到一个更大的字典中。两个字典中有些键不同,有些是相同的。那些不同的,我只是想复制到新的更大的字典中。相同的,我想保持字典和嵌套字典中的键相同,并添加嵌套字典中的值。

样本数据:

dict1 = {'C-STD-B&M-L':
              {datetime.date(2015, 4, 30): 0.06875104,
               datetime.date(2015, 5, 1): 0.07842368,
               datetime.date(2015, 5, 2): 0.08919679999999999,
               datetime.date(2015, 5, 16): 0.40798848},
         'G-CAM-MAS-XXS': 
              {datetime.date(2015, 4, 30): 0.0008190299999999999,
               datetime.date(2015, 5, 1): 0.00093426,
               datetime.date(2015, 5, 2): 0.0010626}

dict2 = {'C-STD-B&M-L':
              {datetime.date(2015, 5, 16): 0.075968,
               datetime.date(2015, 5, 17): 0.086656},
         'H-QLD-BAC-STD': 
              {datetime.date(2015, 5, 16): 0.17804999999999999,
               datetime.date(2015, 5, 17): 0.2031,
               datetime.date(2015, 5, 18): 0.23099999999999998}

预期输出:

 new_dict =  
        {'C-STD-B&M-L':
              {datetime.date(2015, 4, 30): 0.06875104,
               datetime.date(2015, 5, 1): 0.07842368,
               datetime.date(2015, 5, 2): 0.08919679999999999,
               datetime.date(2015, 5, 16): 0.40798848 + 0.075968
               datetime.date(2015, 5, 17): 0.086656},
         'G-CAM-MAS-XXS': 
              {datetime.date(2015, 4, 30): 0.0008190299999999999,
               datetime.date(2015, 5, 1): 0.00093426,
               datetime.date(2015, 5, 2): 0.0010626
         'H-QLD-BAC-STD': 
              {datetime.date(2015, 5, 16): 0.17804999999999999,
               datetime.date(2015, 5, 17): 0.2031,
               datetime.date(2015, 5, 18): 0.23099999999999998}

我将值作为总和 (0.40798848 + 0.075968) 发布只是为了澄清,我实际上需要总和 (0.48395648)。

我试图做一些 for 循环来添加它们,但它们真的很乱,我会为了它而发布。

示例代码:

all_unis_dict = {}
for skus1, subdict1 in unsw_mid_year_dict.items():
    for skus2, subdict2 in unsw_mid_year_dict.items():
        for dates1, days1 in subdict1.items():
            for dates2, days2 in subdict2.items():
                pprint(days1 + days2)

有人知道一种优雅的方法吗?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    似乎是 int 的 defaultdict 的 defaultdict 的用例 ...

    基本思想是,当您遇到不在顶级 defaultdict 中的键时,添加该键(使用关联的 defaultdict(int) 来存储日期 -> 整数映射作为值)。当您遇到不在嵌套字典中的日期时,defaultdict(int) 将添加默认值为0 的日期(因为不带参数调用的int() 返回0)。

    这里有一些具体的代码:

    from collections import defaultdict
    output = defaultdict(lambda: defaultdict(int))
    for d in (dict1, dict2):
        for key, values_dict in d.items():
            for date, integer in values_dict.items():
                output[key][date] += integer
    

    如果您真的想彻底,事后您可以将 default_factory 设置为 None 以防止 defaultdict 出现更多“默认”行为:

    output.default_factory = None
    for default_date_dict in output.values():
        default_date_dict.default_factory = None
    

    【讨论】:

    • 顺便问一下,我可以在哪里找到更多相关信息?我的头有点麻烦,呵呵。
    • @iamfbpt -- 我认为要做的第一件事是开始尝试更多地使用defaultdict。文档位于docs.python.org/2/library/… - 一个很好的例子(和解释)是stackoverflow.com/q/5900578/748858 ...一旦你了解了defaultdict的基础知识,嵌套的就不是too i> 更难掌握。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多