You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何交换值为含非唯一元素列表的字典的键与值

字典反转(值为列表的场景)解决方案

嘿,这个字典反转的问题我帮你搞定啦!针对你给出的场景——原字典键唯一,值是包含唯一/非唯一元素的列表,要生成以原列表元素为键、原键集合为值的新字典,这里有几个实用的实现方式:

方法一:基础循环遍历(直观易懂)

这是最容易理解的写法,适合新手一步步理清逻辑:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:56:48