我是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'
答案 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}