如何用列表元素替换字典键并生成多个目标字典?
问题与解决方法
问题描述
给定列表:
my_list = ['aa', 'bb', 'cc']
和字典:
my_dict = {'source':{'new_key': {'k1': 1, 'k2': 2, 'k3': 3}}}
需要用列表中的每个元素替换字典里的new_key,生成三个独立的字典:
{'source':{'aa': {'k1': 1, 'k2': 2, 'k3': 3}}} {'source':{'bb': {'k1': 1, 'k2': 2, 'k3': 3}}} {'source':{'cc': {'k1': 1, 'k2': 2, 'k3': 3}}}
尝试的代码未成功:
for i in my_list: my_dict ['source'][f'{i}'] = my_dict ['sources']['new_key'] del my_dict ['source']['new_key']
错误分析
- 拼写错误:代码里
my_dict ['sources']多了个s,正确应为my_dict['source'] - 原字典被破坏:第一次循环就删除了
new_key,后续循环找不到该键会直接报错 - 未生成独立字典:所有循环都修改同一个
my_dict,最后只会得到一个以列表最后一个元素为键的字典,无法得到三个独立字典
正确实现
方法一:循环创建新字典
先取出需要复用的子字典,每次循环生成全新的字典结构:
my_list = ['aa', 'bb', 'cc'] my_dict = {'source':{'new_key': {'k1': 1, 'k2': 2, 'k3': 3}}} # 提取要复用的子字典,避免重复查找 sub_content = my_dict['source']['new_key'] result_dicts = [] for key in my_list: # 每次创建新字典,替换目标键 new_dict = {'source': {key: sub_content.copy()}} result_dicts.append(new_dict) # 输出结果 for d in result_dicts: print(d)
方法二:列表推导式简化写法
用列表推导式可以更简洁地生成结果列表:
my_list = ['aa', 'bb', 'cc'] my_dict = {'source':{'new_key': {'k1': 1, 'k2': 2, 'k3': 3}}} sub_content = my_dict['source']['new_key'] result_dicts = [{'source': {k: sub_content.copy()}} for k in my_list] # 逐个打印结果 for item in result_dicts: print(item)
说明:如果后续不需要修改子字典里的内容,可以去掉.copy(),直接引用sub_content即可;如果需要单独修改每个新字典的子字典,必须用.copy()做浅拷贝,否则所有新字典的子字典会指向同一个对象,修改一个会影响其他。
内容的提问来源于stack exchange,提问作者Hiwot
相关产品推荐
相关产品推荐

