python计数器列表的列表?

问题描述:

我想通过调用collections.Counter来计算列表中项目的频率。诀窍是,我的名单本身就包含列表:python计数器列表的列表?

考虑:

[[1,"a"], [2,"b"], [3,"c"], [1,"a"], [1,"a"] 

农产品:

{ 
    ([1,"a"], 3), 
    ([2,"b"], 1), 
    ([3,"c"], 1) 
} 

当我用我的名单实例计数器,我得到TypeError: unhashable type: 'list'.

可以反做我想要的是?有没有其他(合理有效的)方法来做到这一点?

+0

列表是可变的。考虑这个数据和计数是多么短暂。如果每个包含的列表都是一个记录,那么认真考虑GWW和James所建议的关于将包含的列表转换为元组的建议。 – Rookie

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}) 

通常只有不可变类型是可散列的。您可以使用map将列表转换为元组。

from collections import Counter 
x = [[1,"a"], [2,"b"], [3,"c"], [1,"a"], [1,"a"] 
print(Counter(map(tuple, x)))