3

鉴于列表

List2 = ['Apple', 'Apple', 'Apple', 'Black', 'Black', 'Black', 'Green', 'Green', 'Red', 'Yellow']

我试图弄清楚如何计算列表中每个元素出现的次数。这必须非常简单,但我无法弄清楚。我在我的书中读到了 count 函数,我决定尝试实现它。我以为会..

for item in List2:
    newlist=[List2.count()] 

我认为这会导致我得到我想要的:

newlist=[3,3,2,1,1]

但是我收到一个 TypeError 说 count 必须有一个参数。我对 python 非常陌生,所以如果可以的话,尽可能地把所有东西都搞砸。

4

3 回答 3

10

您可以使用collections.Counter,它为您提供了一个dict类似的对象(因为它还具有一些可用于类似计数目的的附加功能),该对象具有作为项目的键和作为出现次数的值。

from collections import Counter


>>> li = ['Apple', 'Apple', 'Apple', 'Black','Black','Black','Green','Green','Red','Yellow']    
>>> Counter(li)
Counter({'Black': 3, 'Apple': 3, 'Green': 2, 'Yellow': 1, 'Red': 1})

然后由你来决定你希望它如何呈现......

保存顺序的一种(低效)方法是计数,然后索引到原始列表中:

>>> counts = Counter(li)
>>> [counts[key] for key in sorted(counts, key=li.index)]
[3, 3, 2, 1, 1]

另一种方法是使用groupby(但这依赖于连续的项目):

>>> from itertools import groupby
>>> [len(list(g)) for k, g in groupby(li)]
[3, 3, 2, 1, 1]
于 2013-03-16T03:10:18.010 回答
1

如果您是 Python 新手,我认为编写解决方案比仅仅导入一些东西更好。这是一个简单易懂的方法:

counter = {}
for elem in List2:
    counter[elem] = counter.get(elem, 0) + 1
于 2013-03-16T04:37:39.380 回答
-1

你可以试试这个:

new_list = [List2.count(x) for x in set(List2)]

这相当于:

new_list = []
for x in set(List2):
    new_list.append(List2.count(x))

或者对于字典:

new_dict = {x:List2.count(x) for x in set(List2)}
于 2013-03-16T03:33:21.467 回答