如何将两个嵌套字典与相同的主键结合起来
How to combine two nested dictionaries with same master keys
我有两个具有相同主键的嵌套字典:
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 的方式来做到这一点 - 例如听写理解?
是:
dict3 = {k: {**v, **dict2[k]} for k, v in dict1.items()}
首先,使用.items()
同时遍历键和值。
然后,对于每个键 k
,您希望值是一个新的字典,它是通过转储(或解构)创建的,其中包含 v
和 dict2[k]
。
更新 Python >= 3.9:
感谢@mwo 提到管道 |
操作数:
dict3 = {k: v | dict2[k] for k, v in dict1.items()}
如果您可以控制数据源,请展平字典,然后使用 update
方法。例如:
dict1 = {('person1', 'name'): 'John'}
dict2 = {('person1', 'weight'): 81.1}
dict1.update(dict2)
>>> dict1
{('person1', 'name'): 'John',
('person1', 'weight'): 81.1}
处理这种数据结构要容易得多,但如果您受困于嵌套字典,您可以使用 NestedDict
通过类似的界面实现相同的结果。
from ndicts.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
.
我有两个具有相同主键的嵌套字典:
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 的方式来做到这一点 - 例如听写理解?
是:
dict3 = {k: {**v, **dict2[k]} for k, v in dict1.items()}
首先,使用.items()
同时遍历键和值。
然后,对于每个键 k
,您希望值是一个新的字典,它是通过转储(或解构)创建的,其中包含 v
和 dict2[k]
。
更新 Python >= 3.9:
感谢@mwo 提到管道 |
操作数:
dict3 = {k: v | dict2[k] for k, v in dict1.items()}
如果您可以控制数据源,请展平字典,然后使用 update
方法。例如:
dict1 = {('person1', 'name'): 'John'}
dict2 = {('person1', 'weight'): 81.1}
dict1.update(dict2)
>>> dict1
{('person1', 'name'): 'John',
('person1', 'weight'): 81.1}
处理这种数据结构要容易得多,但如果您受困于嵌套字典,您可以使用 NestedDict
通过类似的界面实现相同的结果。
from ndicts.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
.