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

反转含非唯一列表值的字典遇哈希错误,求解决方案

解决字典反转(值为非唯一列表)时的TypeError问题

这个问题我之前处理过,一眼就能看出问题所在:字典的键必须是可哈希(hashable)的类型,而你尝试把整个列表v直接作为inv_map的键——列表是可变类型,无法被哈希,所以才会抛出TypeError: unhashable type: 'list'这个错误。

你的需求应该是把原字典中列表里的每个元素作为新字典的键,然后将对应的原字典键分组到列表中对吧?下面给你两种可行的解决方案:

方案一:基础循环写法

手动遍历原字典值中的每个元素,将其作为新键来收集原键:

graph = { 'a': ['car','red'], 'b': ['car','blue'] }
inv_map = {}
for k, values in graph.items():
    # 遍历原字典每个键对应的列表里的元素
    for v in values:
        # 若键不存在则创建空列表,再添加原键k
        inv_map[v] = inv_map.get(v, [])
        inv_map[v].append(k)

方案二:用collections.defaultdict简化代码

借助defaultdict可以省去判断键是否存在的步骤,让代码更简洁:

from collections import defaultdict

graph = { 'a': ['car','red'], 'b': ['car','blue'] }
inv_map = defaultdict(list)
for k, values in graph.items():
    for v in values:
        inv_map[v].append(k)

运行上述代码后,你会得到预期的反转结果:

{'car': ['a', 'b'], 'red': ['a'], 'blue': ['b']}

额外提示:处理重复元素

如果原字典的列表值中存在重复元素,导致反转后的列表出现重复的原键,你可以用集合来自动去重,之后再转回列表:

from collections import defaultdict

graph = { 'a': ['car','red','car'], 'b': ['car','blue'] }
inv_map = defaultdict(set)
for k, values in graph.items():
    for v in values:
        inv_map[v].add(k)
# 将集合转为列表
inv_map = {key: list(items) for key, items in inv_map.items()}

最终结果会是{'car': ['a', 'b'], 'red': ['a'], 'blue': ['b']},自动去掉了重复的'a'。

内容的提问来源于stack exchange,提问作者Shawn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:11:47