![](/img/trans.png)
[英]Python [Nested Dictionary] - How to add new key/values to create this structure of dictionary: d = {key:{key:value, key:value, key:value}}
[英]Create new nested dictionary using nested key, values
我有一个键值对字典,其中的值本身就是一个字典。 我想根据预定义的转换更改该嵌套字典中键值的名称。
我正在使用两个列表来匹配我试图转换的嵌套键的值( 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: KeyError: 'Company1'
我添加到每个列表中的每个项目所需的 output 是:
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'}
go 最简单的方法是重新创建你的字典,理解:
new_dict = {company: update_item(v) for company, v in old_dict.items()}
然后将update_item
解析为它自己的function。 您可以内联执行此操作,但它很难理解。
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
是原始项目的价值,如果您的转换列表不包含您想要的内容,这是一个很好的选择。
一种方法是逐步进行。 首先使用新名称和旧键创建字典,然后删除旧键,最后添加新名称。
# 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.