繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM