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'.
可以反做我想要的是?有没有其他(合理有效的)方法来做到这一点?
答
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)))
列表是可变的。考虑这个数据和计数是多么短暂。如果每个包含的列表都是一个记录,那么认真考虑GWW和James所建议的关于将包含的列表转换为元组的建议。 – Rookie