【问题标题】:How to combine two nested dictionaries with same master keys如何将两个嵌套字典与相同的主键结合起来
【发布时间】:2023-01-04 01:49:03
【问题描述】:

我有两个具有相同主键的嵌套字典:

dict1 = {'person1': {'name': 'John', 'sex': 'Male'},
         'person2': {'name': 'Marie', 'sex': 'Female'},
         'person3': {'name': 'Luna', 'sex': 'Female'},
         'person4': {'name': 'Peter', 'sex': 'Male'}}

dict2 = {'person1': {'weight': '81.1', 'age': '27'},
         'person2': {'weight': '56.7', 'age': '22'},
         'person3': {'weight': '63.4', 'age': '24'},
         'person4': {'weight': '79.1', 'age': '29'}}

所以我想通过 dict2 中的键值对来丰富 dict 1。

我可以用 for 循环来做到这一点......

for key in dict2:
        dict2[key]['age'] = dict1[key]['age']
        dict2[key]['weight'] = dict2[key]['weight']

结果:

dict2 = {'person1': {'name': 'John', 'sex': 'Male', 'weight': '81.1', 'age': '27'},
         'person2': {'name': 'Marie', 'sex': 'Female', 'weight': '56.7', 'age': '22'},
         'person3': {'name': 'Luna', 'sex': 'Female', 'weight': '63.4', 'age': '24'},
         'person4': {'name': 'Peter', 'sex': 'Male', 'weight': '79.1', 'age': '29'}}

......但是有没有更多的pythonic方式来做到这一点 - 例如听写理解?

【问题讨论】:

    标签: python dictionary join nested


    【解决方案1】:

    是的:

    dict3 = {k: {**v, **dict2[k]} for k, v in dict1.items()}
    

    首先,使用.items() 同时遍历键和值。

    然后,对于每个键 k,您希望值是一个新的字典,它是通过转储(或解构)创建的,其中包含 vdict2[k]

    更新 Python >= 3.9:

    感谢@mwo 提到管道 | 操作数:

    dict3 = {k: v | dict2[k] for k, v in dict1.items()}
    

    【讨论】:

    • 在 Python >= 3.9 上,我们还可以执行 {k: v | dict2[k] for k, v in dict1.items()},这在 IMO 上更具可读性。
    • 工作完美——我正在使用的指令真的很大——所以这大大提高了性能。谢谢!
    【解决方案2】:

    如果您可以控制数据源,则将字典展平,然后使用 update 方法。例如:

    dict1 = {('person1', 'name'): 'John'}
    dict2 = {('person1', 'weight'): 81.1}
    dict1.update(dict2)
    
    >>> dict1
    {('person1', 'name'): 'John', 
     ('person1', 'weight'): 81.1}
    

    处理这种数据结构要容易得多,但如果你受困于嵌套字典,你可以使用 NestedDict 通过类似的界面实现相同的结果。

    from ndicts import NestedDict
    
    nd1 = NestedDict(dict1) 
    nd2 = NestedDict(dict2) 
    nd1.update(nd2)
    
    >>> nd1
    NestedDict(
        {'person1': {'name': 'John', 'weight': 81.1}}
    )
    

    如果您需要将结果作为字典,请使用 nd1.to_dict()

    安装ndictspip install ndicts

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2012-09-20
      • 1970-01-01
      相关资源
      最近更新 更多