我有一个键值对的字典,其中值本身就是一个字典。我想根据预定义的转换来更改嵌套字典中键值的名称。
我使用两个列表来匹配我试图转换的嵌套键的值(Old_item1
应该变成New_item1
(:
comparison_list = ['Old_item1', 'Old_item2']
new_prods = ['New_item1', 'New_item2']
old_dict = {
'Company1':
{
'Old_item1':
{
'key1': val,
'key2': val
},
'Old_item2':
{
'key1': val,
'key2': val
}
}
}
我试过这个:
new_dict = {}
for i in comparison_list:
for j in new_prods:
new_dict['Company1'][j] = test['Company1'][i]
我得到一个密钥错误:KeyError: 'Company1'
我添加到每个列表中的每个项目的期望输出是:
new_dict = {
'Company1':
{
'New_item1':
{
'key1': val # old item key, val
'key2': val # old item key, val
}
}
}
您可以创建一个从旧项到新项的映射字典,然后使用它为每个公司创建一个新的子字典。然后,这需要被包裹在公司的外部循环中(尽管这里只有一个(。
例如:
comparison_list = ['Old_item1', 'Old_item2']
new_prods = ['New_item1', 'New_item2']
old_dict = {'Company1':
{'Old_item1':
{'key1': 2,
'key2': 3},
'Old_item2':
{'key1': 4,
'key2': 5}}}
key_mappings = dict(zip(comparison_list, new_prods))
new_dict = {k: {key_mappings[k1]: v1 for k1, v1 in v.items()}
for k, v in old_dict.items()}
print(new_dict)
给出:
{'Company1': {'New_item1': {'key1': 2, 'key2': 3}, 'New_item2': {'key1': 4, 'key2': 5}}}
这是我们使用的映射字典key_mappings
:
{'Old_item1': 'New_item1', 'Old_item2': 'New_item2'}
实现这一点的最简单方法是通过理解重新创建字典:
new_dict = {company: update_item(v) for company, v in old_dict.items()}
然后将update_item
解析为自己的函数。您可以内联执行此操作,但这会使您难以理解。
conversion_lookup = {
'Old_item1': 'NewItem1',
'Old_item2': 'NewItem2',
}
def update_item(item: dict) -> dict:
return { conversion_lookup.get(k, k): v for k, v in item.items() }
new_dict = {company: update_item(v) for company, v in old_dict.items()}
对于这里的转换,我使用了一本描述转换的词典。如果你需要自动构建:
comparison_list = ['Old_item1', 'Old_item2']
new_prods = ['New_item1', 'New_item2']
conversion_lookup = { v: new_prods[idx] for idx, v in enumerate(comparison_list) }
我喜欢字典的原因是你能用some_dict.get(a_value, a_default_value)
。然后,如果您的值不在转换字典中,则可以回退到原始值。这就是我在这里所做的:
conversion_lookup.get(k, k)
第二个k
是原始项的值,如果您的转换列表不包含您想要的内容,那么使用它是一件好事。
一种方法是循序渐进。首先用新名称和旧关键字创建dict,然后删除旧关键字,最后添加新名称。
# Keep the values from the old keys
values = [old_dict['Company1'][old_name] for old_name in comparison_list]
# Remove old names, and add in the
for new_key, value, old in zip(new_prods, values, comparison_list):
old_dict['Company1'].pop(old)
old_dict['Company1'][new_key] = value