Python:如何获取列表中项目的排序计数?

11 投票
3 回答
20767 浏览
提问于 2025-04-15 19:26

在Python中,我有一个这样的物品列表:

mylist = [a, a, a, a, b, b, b, d, d, d, c, c, e]

我想输出类似这样的内容:

a (4)
b (3)
d (3)
c (2)
e (1)

我该如何输出列表中物品的数量和排行榜呢?我对效率不是太在意,只要有办法能实现就行 :)

谢谢!

3 个回答

6

这是一个简短的代码示例:

for count, elem in sorted(((mylist.count(e), e) for e in set(mylist)), reverse=True):
    print '%s (%d)' % (elem, count)
10

我很惊讶没有人提到过 collections.Counter。假设

import collections
mylist = ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'd', 'd', 'd', 'c', 'c', 'e']

这其实只是一行代码:

print(collections.Counter(mylist).most_common())

它会输出:

[('a', 4), ('b', 3), ('d', 3), ('c', 2), ('e', 1)]

需要注意的是,Counterdict 的一个子类,它有一些很实用的方法可以用来计数对象。想了解更多信息,可以参考官方文档

8
from collections import defaultdict

def leaders(xs, top=10):
    counts = defaultdict(int)
    for x in xs:
        counts[x] += 1
    return sorted(counts.items(), reverse=True, key=lambda tup: tup[1])[:top]

这个函数使用了一个叫做 defaultdict 的东西来统计我们列表中每个项目出现的次数。接着,我们把每个项目和它的计数配对,然后按照计数从大到小进行排序。最后,我们取出前面几个计数最高的项目并返回它们。

所以现在我们可以说

>>> xs = list("jkl;fpfmklmcvuioqwerklmwqpmksdvjioh0-45mkofwk903rmiok0fmdfjsd")
>>> print leaders(xs)
[('k', 7), ('m', 7), ('f', 5), ('o', 4), ('0', 3), ('d', 3), ('i', 3), ('j', 3), ('l', 3), ('w', 3)]

撰写回答