是否有任何python模块将计算(列表,列表)元组的频率?

时间:2014-05-29 13:05:57

标签: python list tuples counter

我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像:

mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', 'bar']),(['foo', 'bar'], ['bar', 'bar'])]

我想做类似的事情:

pprint.pprint(Counter(mylist).mostCommon(1)) # returns {(['foo', 'bar'], ['bar', bar']) : count 2}

然而,当我Counter(mylist) python发出错误时,"不可用的类型列表" - 像这个问题一样。 python: unhashable type error

我知道我可以推出自己的计数器like here,但它肯定比Python慢​​得多。是否有任何python模块可以为我做这个?

2 个答案:

答案 0 :(得分:6)

如果您想按照确切的内容计算它们,只需将列表转换为元组:

Counter((tuple(l1), tuple(l2)) for l1, l2 in mylist).most_common(1)

演示:

>>> from collections import Counter
>>> mylist = [(['foo', 'bar'], ['bar', 'bar']), (['bar', 'bar'], ['bar', 'bar']), (['foo', 'bar'], ['bar', 'bar'])]
>>> Counter((tuple(l1), tuple(l2)) for l1, l2 in mylist).most_common(1)[0]
((('foo', 'bar'), ('bar', 'bar')), 2)

现在您的内容可以清洗,可以计算在内。如果必须,您可以随时将密钥重新打开。

答案 1 :(得分:3)

>>> Counter(tuple(map(tuple, elem)) for elem in mylist).most_common(1)
[((('foo', 'bar'), ('bar', 'bar')), 2)]