在列表中计算相似元素数量
我有一个列表,里面又包含了很多小列表。
list = [[1,0],[1,2],[1,1],[1,0]]
现在我想统计一下上面这个列表中,类似的小列表出现了多少次。比如说,像这样:[1,0]:2, [1,2]:1, [1,1]:1
,意思是说[1,0]这个小列表出现了2次,[1,2]出现了1次,[1,1]也出现了1次。
我尝试了这样做:
import collections
print Counter(list)
但是出现了错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/collections.py", line 352, in __init__
self.update(iterable, **kwds)
File "/usr/local/lib/python2.7/collections.py", line 434, in update
self[elem] = self_get(elem, 0) + 1
TypeError: unhashable type: 'list'
我哪里做错了呢?
2 个回答
0
如果我理解你的问题没错的话,你可以像在之前的问题中那样使用 .count() 方法。这个方法可以用来计算列表中某个元素出现的次数。你可以查看这个链接了解更多信息:如何在Python中计算列表项的出现次数?
4
print Counter(tuple(item) for item in my_list)
Counter
实际上是一个字典。字典的键必须是可哈希的,也就是说它们不能改变。但是列表是可变的,所以它们不能作为键使用。这就是为什么你不能直接使用 Counter
的原因。
一种解决办法是把嵌套列表里的元素转换成元组。
my_list = [[1,0],[1,2],[1,1],[1,0]]
from collections import Counter
print Counter(map(tuple, my_list))
# Counter({(1, 0): 2, (1, 2): 1, (1, 1): 1})
如果列表太大了,你可以使用生成器表达式,这样做可以避免在内存中创建一个新的列表,这和 map
不同。而使用元组是可行的,因为元组是不可变的,所以它们是可哈希的。