【问题标题】:Given a list, How to count items in that list?给定一个列表,如何计算该列表中的项目?
【发布时间】:2013-03-16 03:08:24
【问题描述】:

给定列表

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 非常陌生,所以如果可以的话,请尽可能地把所有东西都简化一下。

【问题讨论】:

    标签: python list python-3.x count


    【解决方案1】:

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

    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]
    

    【讨论】:

    • 为了保持顺序,你可以使用class OrderedCounter(Counter, OrderedDict): pass
    • @J.F.Sebastian 我很谦虚-我从来没有想过:(非常感谢
    • 从示例输入中,看起来项目应该是连续的……在这种情况下,groupby 可能是最好的解决方案。 (我可能会使用 ilen 函数,而不是仅仅将 len(list(g)) 放入理解中,而是使用 YAGNI。)
    • @J.F.Sebastian:你确定这行得通吗?在 2.7.2 中使用 OP 的确切测试用例似乎确实对我有用,但是再添加一个 'Yellow',它在 'Red': 1 之前给了我 'Yellow': 2。在 3.3.0 中,它甚至不适用于 OP 的测试用例。所以,我认为你只是在这里走运了,一般情况下它不起作用。
    • @J.F.Sebastian:你显然没有阅读上面的评论。请先阅读后再回复。
    【解决方案2】:

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

    counter = {}
    for elem in List2:
        counter[elem] = counter.get(elem, 0) + 1
    

    【讨论】:

    • 我不同意第一句话。最好学习如何使用“附带的电池”,并且通常寻找更简单和更高级别的解决方案。无论是新程序员,还是来自 C 或 Java 等语言的程序员,都需要这种技能才能成为优秀的 Python 程序员。 值得学习如何自己做事,对于那些你找不到你需要的电池(或想要扩展你找到的电池)的情况。但是自下而上学习并不是一个好主意。
    • @abarnert from collections import Counter 让你成为“优秀的 Python 程序员”?我非常不同意
    • 知道如何找到你需要的工具,以及如何使用它们,会让你成为一名优秀的 Python 程序员。一个能在两周内从头开始构建一个半途而废的脆弱 HTML 解析器的人,比能在两个小时内找到 BeautifulSoup、阅读文档和编写有用代码的人的帮助要小得多。
    【解决方案3】:

    你可以试试这个:

    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)}
    

    【讨论】:

    • @JonClements 是的,你的效率显然更高,但这只是一种“不导入”的替代方案......
    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多