Python 在 dict_keys 中查找字典和嵌套值并交换值
Python lookup dict and nested values in dict_keys and swap value
我正在尝试将字典 (dic_map) 中的值与字典 (B) 中的值交换,其中 dic_map[key] = B. 给我一个包含这些值的新字典来自 B 例如
dic_map = {
'Name': 'name',
'Id': 'guid',
'address':{
'address1': 'road',
'address2': 'road_nr',
'address3': 'zipcode',
'address4': 'city'
},
'tax': True,
'isValid': False,
'specific': 1,
'credit': 200
}
B = {
'name': 'Michael Jackson',
'guid': '032-567-781',
'road': 'The greatest Dr',
'road_nr': 42,
'zipcode': 90210,
'city': 'Hollywood',
'country': 'USA'
}
最后的指令
desired_result = {
'Name': 'Michael Jackson',
'Id': '032-567-781',
'address':{
'address1': 'The greatest Dr',
'address2': 42,
'address3': 90210,
'address4': 'Hollywood',
},
'tax': True,
'isValid': False,
'specific': 1,
'credit': 200
}
这是我目前所拥有的
def swap_values(dic_values, dic_map):
d = {}
for k1 in dic_values.keys():
for k2 in dic_map.keys():
if k1 == dic_map[k2]:
d[k2]=dic_values[k1]
else:
d[k2]=dic_map[k2]
return d
据我所知,有两件事不起作用,1. 我的值被 else 语句覆盖,2. 嵌套的 dict 永远不会被评估。任何帮助将不胜感激。
这是我得到的:
def dmap(template, values):
for key, val in template.items():
if isinstance(val, dict):
dmap(val, values)
else:
if val in values:
template[key] = values[val]
如果我 运行 dmap(dic_map, B)
我得到:
{
'Id': '032-567-781',
'Name': 'Michael Jackson',
'address': {
'address1': 'The greatest Dr',
'address2': 42,
'address3': 90210,
'address4': 'Hollywood'
},
'credit': 200,
'isValid': False,
'specific': 1,
'tax': True
}
因为有内部字典,我们必须对每个内部字典重复替换操作。执行此类任务的最简单方法是使用递归。
验证类型被认为不是很pythonic,但它会完成工作。你可以这样做:
def swap_values(dic_values, dic_map):
d = {}
for k, v in dic_values.items():
if isinstance(v, dict):
d[k] = swap_values(v, dic_map)
else:
d[k] = dic_map.get(v, v)
return d
示例用法:
>>> dic_map = {
... 'Name': 'name',
... 'Id': 'guid',
... 'address':{
... 'address1': 'road',
... 'address2': 'road_nr',
... 'address3': 'zipcode',
... 'address4': 'city'
... },
... 'tax': True,
... 'isValid': False,
... 'specific': 1,
... 'credit': 200
... }
>>>
>>>
>>> B = {
... 'name': 'Michael Jackson',
... 'guid': '032-567-781',
... 'road': 'The greatest Dr',
... 'road_nr': 42,
... 'zipcode': 90210,
... 'city': 'Hollywood',
... 'country': 'USA'
... }
>>> swap_values(dic_map, B)
{'specific': 1, 'Name': 'Michael Jackson', 'credit': 200, 'address': {'address1': 'The greatest Dr', 'address2': 42, 'address4': 'Hollywood', 'address3': 90210}, 'isValid': False, 'tax': True, 'Id': '032-567-781'}
如果没有内部字典,我们可以使用:
def swap_values(dic_values, dic_map):
d = {}
for k, v in dic_values.items():
d[k] = dic_map.get(v, v)
return d
示例用法:
>>> dic_map = {
... 'Name': 'name',
... 'Id': 'guid',
... 'tax': True,
... 'isValid': False,
... 'specific': 1,
... 'credit': 200
... }
>>>
>>>
>>> B = {
... 'name': 'Michael Jackson',
... 'guid': '032-567-781',
... 'road': 'The greatest Dr',
... 'road_nr': 42,
... 'zipcode': 90210,
... 'city': 'Hollywood',
... 'country': 'USA'
... }
>>> swap_values(dic_map, B)
{'specific': 1, 'isValid': False, 'Name': 'Michael Jackson', 'Id': '032-567-781', 'tax': True, 'credit': 200}
我正在尝试将字典 (dic_map) 中的值与字典 (B) 中的值交换,其中 dic_map[key] = B. 给我一个包含这些值的新字典来自 B 例如
dic_map = {
'Name': 'name',
'Id': 'guid',
'address':{
'address1': 'road',
'address2': 'road_nr',
'address3': 'zipcode',
'address4': 'city'
},
'tax': True,
'isValid': False,
'specific': 1,
'credit': 200
}
B = {
'name': 'Michael Jackson',
'guid': '032-567-781',
'road': 'The greatest Dr',
'road_nr': 42,
'zipcode': 90210,
'city': 'Hollywood',
'country': 'USA'
}
最后的指令
desired_result = {
'Name': 'Michael Jackson',
'Id': '032-567-781',
'address':{
'address1': 'The greatest Dr',
'address2': 42,
'address3': 90210,
'address4': 'Hollywood',
},
'tax': True,
'isValid': False,
'specific': 1,
'credit': 200
}
这是我目前所拥有的
def swap_values(dic_values, dic_map):
d = {}
for k1 in dic_values.keys():
for k2 in dic_map.keys():
if k1 == dic_map[k2]:
d[k2]=dic_values[k1]
else:
d[k2]=dic_map[k2]
return d
据我所知,有两件事不起作用,1. 我的值被 else 语句覆盖,2. 嵌套的 dict 永远不会被评估。任何帮助将不胜感激。
这是我得到的:
def dmap(template, values):
for key, val in template.items():
if isinstance(val, dict):
dmap(val, values)
else:
if val in values:
template[key] = values[val]
如果我 运行 dmap(dic_map, B)
我得到:
{
'Id': '032-567-781',
'Name': 'Michael Jackson',
'address': {
'address1': 'The greatest Dr',
'address2': 42,
'address3': 90210,
'address4': 'Hollywood'
},
'credit': 200,
'isValid': False,
'specific': 1,
'tax': True
}
因为有内部字典,我们必须对每个内部字典重复替换操作。执行此类任务的最简单方法是使用递归。
验证类型被认为不是很pythonic,但它会完成工作。你可以这样做:
def swap_values(dic_values, dic_map):
d = {}
for k, v in dic_values.items():
if isinstance(v, dict):
d[k] = swap_values(v, dic_map)
else:
d[k] = dic_map.get(v, v)
return d
示例用法:
>>> dic_map = {
... 'Name': 'name',
... 'Id': 'guid',
... 'address':{
... 'address1': 'road',
... 'address2': 'road_nr',
... 'address3': 'zipcode',
... 'address4': 'city'
... },
... 'tax': True,
... 'isValid': False,
... 'specific': 1,
... 'credit': 200
... }
>>>
>>>
>>> B = {
... 'name': 'Michael Jackson',
... 'guid': '032-567-781',
... 'road': 'The greatest Dr',
... 'road_nr': 42,
... 'zipcode': 90210,
... 'city': 'Hollywood',
... 'country': 'USA'
... }
>>> swap_values(dic_map, B)
{'specific': 1, 'Name': 'Michael Jackson', 'credit': 200, 'address': {'address1': 'The greatest Dr', 'address2': 42, 'address4': 'Hollywood', 'address3': 90210}, 'isValid': False, 'tax': True, 'Id': '032-567-781'}
如果没有内部字典,我们可以使用:
def swap_values(dic_values, dic_map):
d = {}
for k, v in dic_values.items():
d[k] = dic_map.get(v, v)
return d
示例用法:
>>> dic_map = {
... 'Name': 'name',
... 'Id': 'guid',
... 'tax': True,
... 'isValid': False,
... 'specific': 1,
... 'credit': 200
... }
>>>
>>>
>>> B = {
... 'name': 'Michael Jackson',
... 'guid': '032-567-781',
... 'road': 'The greatest Dr',
... 'road_nr': 42,
... 'zipcode': 90210,
... 'city': 'Hollywood',
... 'country': 'USA'
... }
>>> swap_values(dic_map, B)
{'specific': 1, 'isValid': False, 'Name': 'Michael Jackson', 'Id': '032-567-781', 'tax': True, 'credit': 200}