如何交换值为含非唯一元素列表的字典的键与值
字典反转(值为列表的场景)解决方案
嘿,这个字典反转的问题我帮你搞定啦!针对你给出的场景——原字典键唯一,值是包含唯一/非唯一元素的列表,要生成以原列表元素为键、原键集合为值的新字典,这里有几个实用的实现方式:
方法一:基础循环遍历(直观易懂)
这是最容易理解的写法,适合新手一步步理清逻辑:
d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']} d_inverse = {} # 遍历原字典的每一组键值对 for original_key, value_list in d.items(): # 遍历值列表里的每个元素 for item in value_list: # 如果元素已经是新字典的键,就把原键追加到列表里 if item in d_inverse: d_inverse[item].append(original_key) # 否则创建新的键值对,值是包含原键的列表 else: d_inverse[item] = [original_key] print(d_inverse) # 输出结果: {'1': ['a', 'b', 'c'], '2': ['a'], '3': ['a', 'c']}
方法二:用collections.defaultdict简化代码
如果不想写冗余的存在性判断,可以借助Python标准库的defaultdict,它会自动为不存在的键初始化空列表:
from collections import defaultdict d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']} # 初始化一个默认值为列表的字典 d_inverse = defaultdict(list) for original_key, value_list in d.items(): for item in value_list: # 直接追加即可,无需判断键是否存在 d_inverse[item].append(original_key) # 可选:如果需要转换成普通字典(不是必须操作) d_inverse = dict(d_inverse) print(d_inverse)
方法三:字典推导式(一行代码实现,进阶写法)
追求简洁的话,可以用嵌套的字典推导式,不过可读性稍弱,适合熟悉Python语法的开发者:
d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']} # 先提取所有唯一的列表元素作为新键,再收集对应的原键 d_inverse = { item: [k for k, v_list in d.items() if item in v_list] for item in set(v for v_list in d.values() for v in v_list) } print(d_inverse)
小提示
- 三种方法都能实现需求,优先推荐前两种,尤其是
defaultdict的写法,代码更简洁易维护。 - 要确保原列表里的元素是可哈希类型(比如字符串、数字,你的示例完全符合),因为字典的键必须是可哈希的。
内容的提问来源于stack exchange,提问作者LucSpan
相关产品推荐
相关产品推荐

