使用Counter统计字典值时出现unhashable type: 'list'报错如何解决
错误原因
Counter统计频率时要求被统计的元素是可哈希类型,而你字典的value都是list类型,列表属于可变不可哈希类型,因此直接传入EYES.values()会触发TypeError: unhashable type: 'list'报错。
你之前修改的Counter(map(tuple(EYES.values())))存在语法错误,map()的第一个参数需要是转换函数,第二个参数才是待转换的可迭代对象,直接调用tuple(EYES.values())不符合语法要求。
修复方案
你可以根据自己的统计需求选择对应方案:
方案1:统计完整列表的出现频率
如果需要把每个value的完整列表作为统计单元,先将所有列表转为不可变、可哈希的tuple类型再统计:
from collections import Counter def frequency(EYES): Eyes_freq_dict = Counter(tuple(v) for v in EYES.values()) return Eyes_freq_dict EYEScounter = frequency(df_dict) EYESlist = list(EYEScounter.values())
方案2:统计列表内单个元素的出现频率
如果需要统计所有value列表中各个独立元素的总出现频率,先把嵌套的列表打平再统计:
from collections import Counter import itertools def frequency(EYES): # 打平所有嵌套的value列表 all_elements = itertools.chain.from_iterable(EYES.values()) Eyes_freq_dict = Counter(all_elements) return Eyes_freq_dict EYEScounter = frequency(df_dict) EYESlist = list(EYEScounter.values())
内容的提问来源于stack exchange,提问作者V_sqrt
相关产品推荐
相关产品推荐

