反转含非唯一列表值的字典遇哈希错误,求解决方案
解决字典反转(值为非唯一列表)时的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
相关产品推荐
相关产品推荐

