Python列表转字典报错TypeError: unhashable type: 'list' 咨询
搞定TypeError: unhashable type: 'list'这个问题
嘿,这个错误我太熟悉啦!咱们来一步步拆解问题,搞定它~
为啥会报错?
你碰到的TypeError: unhashable type: 'list',本质原因是你用来遍历的列表d,里面的元素不是你以为的字符串姓名,而是列表类型。字典的键必须是「可哈希」的类型——简单说就是不可变的对象,比如字符串、数字、元组这些,而列表是可变的,没法被哈希,自然不能当字典的键用。
怎么解决?
分两种常见场景来处理:
场景1:d里的每个元素是只装了一个姓名的子列表
比如你的d是这种结构:[["张三"], ["李四"], ["张三"]],那你只需要把每个子列表里的姓名取出来,再作为键存入字典就行:
dic = {} for item in d: # 取出子列表里的第一个元素(也就是姓名) name = item[0] dic[name] = dic.get(name, 0) + 1 print(dic)
场景2:你需要把整个子列表作为统计的键
如果你的需求是统计整个子列表的出现次数,那可以把可变的列表转成不可变的元组(元组是可哈希的),再作为键:
dic = {} for item in d: # 把列表转成元组,变成可哈希的键 key = tuple(item) dic[key] = dic.get(key, 0) + 1 print(dic)
更省心的写法
其实Python自带了专门做统计的工具collections.Counter,用它能省不少代码:
- 对应场景1:
from collections import Counter # 先把所有姓名提取出来,再一键统计 names_list = [item[0] for item in d] count_dic = Counter(names_list) print(count_dic)
- 对应场景2:
from collections import Counter # 把每个列表转成元组后直接统计 count_dic = Counter(tuple(item) for item in d) print(count_dic)
内容的提问来源于stack exchange,提问作者MCN
相关产品推荐
相关产品推荐

