如何在python中获取元素的频率?

时间:2014-02-14 06:29:45

标签: python

我是python的新手,在操作列表方面有点挣扎。我有一个大致看起来像这样的列表

rows = [[u'12'], [u'12'], [u'12'], [u'12'], [u'13'], [u'13'], [u'14'], [u'14'], [u'14']]

。我想得到每个元素的计数。我希望结果看起来像这样

res = [[12,4], [13,2], [14,3]]

我该怎么做?我试过了

collections.Counter(rows)

但它给了我

TypeError: Unhashable type 'list'

3 个答案:

答案 0 :(得分:2)

子列表总是只有一个项目吗?

>>> rows = [[u'12'],[u'12'],[u'12'],[u'12'],[u'13'],[u'13'],[u'14'],[u'14'],[u'14']]
>>> from collections import Counter
>>> [[int(k), v] for k, v in Counter(i[0] for i in rows).items()]
[[13, 2], [12, 4], [14, 3]]

如果子列表可以有多个项目

>>> [[int(k), v] for k, v in Counter(j for i in rows for j in i).items()]
[[13, 2], [12, 4], [14, 3]]

如果订单很重要,您可以将sorted投入混合

>>> sorted([int(k), v] for k, v in Counter(i[0] for i in rows).items())
[[12, 4], [13, 2], [14, 3]]

答案 1 :(得分:0)

collections.Counter是要走的路。但实际上你实际上是在传递列表列表。您实际上需要展平列表列表,然后将其传递给Counter

rows = [[u'12'],[u'12'],[u'12'],[u'12'],[u'13'],[u'13'],[u'14'],[u'14'],[u'14']]
from itertools import chain
from collections import Counter
res = sorted(Counter(int(item) for item in chain.from_iterable(rows)).items())
print res

<强>输出

[(12, 4), (13, 2), (14, 3)]

答案 2 :(得分:0)

您收到错误TypeError: Unhashable type 'list'的原因是因为您尝试将列表作为字典的键而不允许,因为list是一个可变对象。可变对象不允许是键,因为它们可以更改。您有上述问题的几种选择。您可以将列表转换为不可变对象的元组,或者因为看起来您的列表只包含一个元素,所以您可以获得第一个元素。以下是以下内容的实现:

rows = [[u'12'], [u'12'], [u'12'], [u'12'], [u'13'], [u'13'], [u'14'], [u'14'], [u'14']]
count_dict = {}
for row in rows:
    key = row[0]
    if key in count_dict:
        count_dict[key] += 1
    else:
        count_dict[key] = 1 

print count_dict
  

这会让你{u'13': 2, u'12': 4, u'14': 3}