我想通过传递带有替换嵌套键的函数的映射dict来替换字典的键名。 问题是我在嵌套字典中有多个名为'id'的键,我想用特定名称重命名这些'id'。
首字母:
initial_dict = {'id': 1, 'netAmount': 10.2, 'modifiedOn': '2017-01-01',
'statusId': 3, 'approvalStateId': 3, 'approvalState': {'id': 3,'name':'Approved'}}
映射字典:
mapping_dict = {'id': 'pr_id', 'netAmount': 'net_amount', 'modifiedOn': 'modified_date',
'statusId': 'status_id', 'approvalStateId': 'approval_id','approvalState':{'id':'approv_id'}}
字典的所需输出:
output_dict = {'pr_id': 1, 'net_amount': 10.2, 'modified_date': '2017-01-01',
'status_id': 3, 'approval_id': 3, 'approvalState': {'approv_id': 3, 'name': 'Approved'}}
我所做的是这个,但它只替换了第一级dict的键,如果我尝试在映射dict中设置嵌套键,我会收到错误。
def map_fields(obj):
new_obj = {}
mapping_dict = {'id': 'pr_id', 'netAmount': 'net_amount', 'modifiedOn': 'modified_date',
'statusId': 'status_id', 'approvalStateId': 'approval_id','approvalState':{'id':'approv_id'}}
for key in obj.keys():
if key in mapping_dict:
new_key = mapping_dict[key]
else:
new_key = key
new_obj[new_key] = obj[key]
return new_obj
你知道怎么做吗?
由于
答案 0 :(得分:2)
您需要一个递归函数才能升级嵌套字典。关键是,在递归时,您需要传递子字典和子映射字典。
请注意,映射字典的结构特定于此问题,并且不允许您更改嵌套字典的键 - 您需要重新构建映射的方式以实现该目标。
以下应该做你想要的(添加打印语句以帮助它在运行时遵循逻辑):
def map_fields(init_dict, map_dict, res_dict=None):
res_dict = res_dict or {}
for k, v in init_dict.items():
print("Key: ", k)
if isinstance(v, dict):
print("value is a dict - recursing")
v = map_fields(v, map_dict[k])
elif k in map_dict.keys():
print("Remapping:", k, str(map_dict[k]))
k = str(map_dict[k])
res_dict[k] = v
return res_dict
print(map_fields(initial_dict, mapping_dict))
答案 1 :(得分:0)
如果您希望得到相同的结果,但又不想使用嵌套映射字典,例如:
mapping_dict = {'id': 'pr_id', 'netAmount': 'net_amount', 'modifiedOn': 'modified_date',
'statusId': 'status_id', 'approvalStateId': 'approval_id', 'id':'approv_id'}
(即“ id” /“ approv_id”未嵌套在“ approvalState”中)
您可以使用稍有不同的功能:
def map_fields(init_dict, map_dict, res_dict=None):
res_dict = res_dict or {}
for k, v in init_dict.items():
if isinstance(v, dict):
v = map_fields(v, map_dict)
if k in map_dict.keys():
k = str(map_dict[k])
res_dict[k] = v
return res_dict
如果键“ approvalState”也要映射(例如要映射到“ resultState”之类,也就是说,如果您的结果需要是这样的话,
output_dict = {'pr_id': 1, 'net_amount': 10.2, 'modified_date': '2017-01-01',
'status_id': 3, 'approval_id': 3, 'resultState': {'approv_id': 3, 'name': 'Approved'}}
在这种情况下,您只需要在映射字典中添加键/值对“ approvalState” /“ resultState”即可。