Python 根据一个dict的结构(骨架)和另一个dict的相应值创建嵌套字典
假设我有一个dictionary,名为Python 根据一个dict的结构(骨架)和另一个dict的相应值创建嵌套字典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,假设我有一个dictionary,名为dict1,它具有我想要的新字典的骨架(顺序和嵌套深度)。例如: dict1 = { "Personnel": { "Performance": "" }, "Gaming": { "Status": "", "Bug Status": "" }, "Compatible": { "Minimum": "", "Integrity": "", "Scalin
dict1
,它具有我想要的新字典的骨架(顺序和嵌套深度)。例如:
dict1 = {
"Personnel": {
"Performance": ""
},
"Gaming": {
"Status": "",
"Bug Status": ""
},
"Compatible": {
"Minimum": "",
"Integrity": "",
"Scaling": ""
},
"Comparison": {
"Difference": {
"DirectX": ""
},
"Vendor": {
"Intel": "",
"Xiaomi": ""
}
}
}
new_dict = {k: {v_k: dict2[k][v_k] for v_k in v_dict} for k, v_dict in dict1.items() }
我还有另一个字典,名为dict2
,它的值与上面dict1
字典中的键对应,还有一些额外的键值对,如下所示:
dict2 = {
"Personnel": {
"Performance": "10.5",
"Maximum": "50.5"
},
"Gaming": {
"Status": "Cool",
"Bug Status": "None",
"Green Status": "Black"
},
"Compatible": {
"Minimum": "5",
"Integrity": "Yes",
"Scaling": "No"
},
"Comparison": {
"Difference": {
"DirectX": "50",
"Android": "70"
},
"Vendor": {
"Xiaomi": "40"
}
},
"Another property": {
"Testinfo": "TestTest",
"Important": {
"Wow": "MuchDoge"
}
}
}
我想创建一个新字典,其中包含来自dict1
的框架和从dict2
获取的键的相应值
注意:我想跳过不属于dict1
部分的键:值对。例如:在我的新字典中,我不需要“绿色状态”:“黑色”
下面是我尝试的代码:
def update(dict1 : dict, dict2: dict):
new_data = {}
for k, v in dict1.items():
if isinstance(v, dict):
v = update(v, dict(dict2.keys()))
if v not in dict2.keys():
new_data[k] = v
return new_data
但是我完全遗漏了一些东西。您可以使用嵌套字典理解来实现这一点。迭代dict1.items()
以获得(键、值)
对的类型。再次迭代上一操作中的value
dict以获取嵌套新dict所需的键。然后,从dict2
中获取相应的键值。例如:
dict1 = {
"Personnel": {
"Performance": ""
},
"Gaming": {
"Status": "",
"Bug Status": ""
},
"Compatible": {
"Minimum": "",
"Integrity": "",
"Scaling": ""
},
"Comparison": {
"Difference": {
"DirectX": ""
},
"Vendor": {
"Intel": "",
"Xiaomi": ""
}
}
}
new_dict = {k: {v_k: dict2[k][v_k] for v_k in v_dict} for k, v_dict in dict1.items() }
如果some\u key
键不存在,最好使用dict.get('some\u key')
来处理异常。因此,上述词典理解表达式将变为:
new_dict = {k: {v_k: dict2.get(k, {}).get(v_k) for v_k in v_dict} for k, v_dict in dict1.items() }
如果dict2
中不存在来自dict1
的任何键,则将None
存储为值
对于您的示例数据,上述代码将返回new\u dict
,如下所示:
{
"Compatible": {
"Scaling": "No",
"Minimum": "5",
"Integrity": "Yes"
},
"Personnel": {
"Performance": "10.5"
},
"Gaming": {
"Status": "Cool",
"Bug Status": "None"
},
"Comparison": {
"Difference": {
"Android": "70",
"DirectX": "50"
},
"Vendor": {
"Xiaomi": "40"
}
}
}
您可以将递归与
zip
一起使用:
from pprint import pprint
dict1 = {'Personnel':
{'Performance': ''},
'Gaming':
{'Status': '',
'Bug Status': ''},
'Compatible':
{'Minimum': '',
'Integrity': '',
'Scaling': ''},
'Comparison':
{'Difference':
{'DirectX': ''},
'Vendor':
{'Intel': '',
'Xiaomi': ''}
}
}
dict2 = {'Personnel':
{'Performance': '10.5',
'Maximum': '50.5'},
'Gaming':
{'Status': 'Cool',
'Bug Status': 'None',
'Green Status': 'Black',
},
'Compatible':
{'Minimum': '5',
'Integrity': 'Yes',
'Scaling': 'No'},
'Comparison':
{'Difference':
{'DirectX': '50',
'Android': '70'},
'Vendor':
{ 'Xiaomi': '40'}
},
'Another property':
{
'Testinfo': 'TestTest',
'Important': {
'Wow': 'MuchDoge'
}
}
}
def update(h, j):
return {a:d if (a == c and not isinstance(b, dict)) or not isinstance(b, dict) or not isinstance(d, dict) else update(b.items(), d.items()) for (a, b), (c, d) in zip(h, j)}
pprint(update(dict1.items(), dict2.items()))
输出:
{'Comparison': {'Difference': 'TestTest', 'Vendor': {'Intel':
'MuchDoge'}},
'Compatible': {'Integrity': 'Yes', 'Minimum': '5', 'Scaling': 'No'},
'Gaming': {'Bug Status': {'Xiaomi': '40'},
'Status': {'Android': '70', 'DirectX': '50'}},
'Personnel': {'Performance': '10.5'}}