我想通过调用collections.Counter来计算列表中项目的频率。诀窍是我的列表本身包含列表:
假设:
[[1,"a"], [2,"b"], [3,"c"], [1,"a"], [1,"a"]
农产品:
{
([1,"a"], 3),
([2,"b"], 1),
([3,"c"], 1)
}
当我使用我的列表实例化Counter时,我得到TypeError: unhashable type: 'list'.
Counter可以做我想要的吗?这样做有其他(合理有效的)方法吗?
答案 0 :(得分:4)
Counter
返回一个哈希表。为了实现这一点,密钥(计算的内容)必须是可清除的。不幸的是,列表不可清除,这就是您看到错误的原因。
一种解决方法是将每个内部列表转换为tuple
。
from collections import Counter
x = [[1,"a"], [2,"b"], [3,"c"], [1,"a"], [1,"a"]]
Counter(tuple(item) for item in x)
# returns:
Counter({(1, 'a'): 3, (2, 'b'): 1, (3, 'c'): 1})
答案 1 :(得分:3)
通常只有不可变类型是可清除的。您可以使用map将列表转换为元组。
INDEX