Python如何提取字典列表值元素并反向映射原键生成新字典
错误原因
- 访问字典的方式错误:Python字典不能直接用数字下标
dict[i]取值,这种写法是查找键为整数i的项,你的原字典键是'A'、'B'这类字符串,不存在整数键,自然会触发键错误;另外你写的i+1索引超出字典键的遍历范围,也是触发索引越界的直接原因。 - 实现逻辑冗余:不需要复制原字典做多层交叉比对,只需要单次遍历原字典的键值对,就能完成映射关系的构建。
可行实现方案
原生Python实现(无需导入额外模块)
逻辑非常直接:初始化空的新字典,遍历原字典每一个键和对应的数值列表,把列表里的每个数值作为新字典的键,将当前原字典的键追加到新键对应的列表中即可。
# 不要用dict作为变量名,会覆盖Python内置的字典类 original_dict = {'A':[1,2,5],'B':[3,6,13],'C':[2,3,6],'D':[4,6,8]} new_dict = {} for old_key, num_list in original_dict.items(): for num in num_list: if num in new_dict: new_dict[num].append(old_key) else: new_dict[num] = [old_key]
运行后new_dict的输出和你预期的结果完全一致:
{1: ['A'], 2: ['A', 'C'], 5: ['A'], 3: ['B', 'C'], 6: ['B', 'C', 'D'], 13: ['B'], 4: ['D'], 8: ['D']}
提示:Python 3.7及以上版本的字典默认保留插入顺序,如果需要严格匹配你给出的键排序,只需要在构建完成后对键排序重建字典即可,映射逻辑不受影响。
简洁版实现(借助collections.defaultdict)
如果可以导入标准库模块,用defaultdict可以省去判断键是否存在的步骤,代码更简洁:
from collections import defaultdict original_dict = {'A':[1,2,5],'B':[3,6,13],'C':[2,3,6],'D':[4,6,8]} new_dict = defaultdict(list) for old_key, num_list in original_dict.items(): for num in num_list: new_dict[num].append(old_key) # 如需转成普通字典,加下面这行即可 new_dict = dict(new_dict)
内容的提问来源于stack exchange,提问作者Priyankush Ghosh
相关产品推荐
相关产品推荐

