使用嵌套键、值创建新的嵌套字典



我有一个键值对的字典,其中值本身就是一个字典。我想根据预定义的转换来更改嵌套字典中键值的名称。

我使用两个列表来匹配我试图转换的嵌套键的值(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

最新更新