【问题标题】:Python3 Merge two dictionaries based on sub dictionaries keys w/o for loopPython3基于子字典键合并两个字典,没有for循环
【发布时间】:2021-10-08 18:00:24
【问题描述】:

也许这是不可能的,但如果没有通过给定字典中每个键的 for 循环,则根据字典中的键合并两者

给定:

dict1 = { 'APPL' : { 'cp': 1, 'sed': 'bull'}, 'BAC' : { 'cp': 1, 'sed': 'bull'}}
dict2 = { 'APPL' : { 'tp': 100}}
dict3 = dict1 | dict2  ## python ≥3.9 only
print(dict3)
{'APPL': {'tp': 100}, 'BAC': {'cp': 1, 'sed': 'bull'}}
dict1.update(dict2)
print(dict1)
{'APPL': {'tp': 100}, 'BAC': {'cp': 1, 'sed': 'bull'}} 

期望的输出

{'APPL': {'tp': 100,'cp': 1, 'sed': 'bull'}, 'BAC': {'cp': 1, 'sed': 'bull'}} 

我现在可以用 for 循环来做,只是想知道是否有更优雅的解决方案

【问题讨论】:

  • this 或许就是您要找的东西
  • 你愿意使用 pandas 吗?没有循环,它不会(如你所说)优雅,只会是硬编码。
  • 是否存在根密钥不包含另一个字典的风险,或者存在两个以上级别的字典?

标签: python json dictionary python-3.9


【解决方案1】:

做:

dict1 = {'APPL': {'cp': 1, 'sed': 'bull'}, 'BAC': {'cp': 1, 'sed': 'bull'}}
dict2 = {'APPL': {'tp': 100}}

res = {key: {**value, **dict2.get(key, {})} for key, value in dict1.items()}
print(res)

输出

{'APPL': {'cp': 1, 'sed': 'bull', 'tp': 100}, 'BAC': {'cp': 1, 'sed': 'bull'}}

【讨论】:

    【解决方案2】:

    不,如果没有迭代,这是不可能的。您可以使用自定义连接函数,然后减少字典列表:

    data = [{'BAC': {'a': 40}, 'XYZ': {'c': 81, 'b': 16}, 'ABC': {'b': 85}},
            {'APPL': {'b': 55},
             'BAC': {'b': 16, 'f': 59},
             'ABC': {'d': 9, 'c': 43},
             'XYZ': {'b': 82}},
            {'ABC': {'b': 43, 'c': 35},
             'APPL': {'f': 17, 'a': 1, 'd': 16},
             'BAC': {'f': 35, 'a': 1},
             'XYZ': {'a': 2, 'c': 55}},
            {'BAC': {'f': 4, 'd': 87},
             'XYZ': {'d': 31, 'f': 92},
             'APPL': {'b': 18, 'a': 74, 'c': 69}},
            {'XYZ': {'d': 84, 'f': 49},
             'ABC': {'d': 88, 'a': 82, 'f': 96},
             'APPL': {'a': 23},
             'BAC': {'b': 40}},
            {'BAC': {'c': 88, 'd': 38},
             'APPL': {'c': 48, 'b': 30},
             'ABC': {'d': 95, 'b': 38},
             'XYZ': {'d': 90, 'a': 5}}]
    
    
    def join_dict(d1, d2):
        result = {k: {**d1[k], **d2[k]} for k in d1}
        result.update({k: {**d1[k], **d2[k]} for k in d2})
        return result
    
    >>> import functools
    >>> functools.reduce(join_dict, data)
    {'XYZ': {'a': 39, 'f': 78, 'c': 42, 'd': 30, 'b': 24},
     'ABC': {'c': 22, 'f': 69, 'a': 8, 'b': 51, 'd': 70},
     'APPL': {'d': 19, 'b': 35, 'a': 6, 'f': 33, 'c': 64},
     'BAC': {'f': 97, 'c': 38, 'd': 1, 'b': 63, 'a': 91}}
    

    当然,这将覆盖子字典中的任何常见值。假设这对您来说不是问题,这应该可以作为“更优雅的解决方案”正常工作。

    【讨论】:

      最近更新 更多