如何计算列表项的出现次数?

How do I count the occurrences of a list item?

提问人:weakish 提问时间:4/8/2010 最后编辑:Karl Knechtelweakish 更新时间:2/25/2023 访问量:2864616

问:

给定一个项目,如何在 Python 中计算它在列表中的出现次数?


一个相关但不同的问题是计算集合中每个不同元素的出现次数,将字典或列表作为直方图结果而不是单个整数。有关该问题,请参阅使用字典对列表中的项目进行计数

Python 列表 计数

评论

2赞 metatoaster 7/29/2022
作为参考,meta 上的这个线程讨论了这两个线程保持原样开放的原因。
2赞 Peter Cordes 7/30/2022
正如在元上所讨论的,这个问题名义上是关于计算单个项目。多年来,它吸引了关于相关但显着不同的直方图问题的多个(好的)答案;计算每个不同的元素,它应该使用 O(n) 算法,而不是每个 O(n^2) 的元素。理想情况下,这些应该在(a)不同的问答中,但现在它们在这里。.count

答:

2491赞 Łukasz 4/8/2010 #1

如果只需要单个项目的计数,请使用以下方法:count

>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3

重要提示:如果您要计算多个不同的项目,这将非常慢

每个调用都会遍历整个元素列表。循环调用意味着总检查,这对性能来说可能是灾难性的。countncountnn * n

如果要对多个项目进行计数,请使用计数器,它只执行总检查。n

评论

19赞 cpp-coder 9/10/2017
mylist = [1,7,7,7,3,9,9,9,7,9,10,0] print sorted(set([i for i in mylist if mylist.count(i)>2]))
8赞 Konstantinos 2/11/2022
在我的案例中,计算唯一元素产生了以下时间:114.19秒,0.53 秒和 0.17 秒。差异是惊人的。list.count()numpy.unique(list, return_counts = True)Counter
57赞 Silfverstrom 4/8/2010 #2

list.count(x)返回列表中出现的次数x

请参见:http://docs.python.org/tutorial/datastructures.html#more-on-lists

2384赞 user52028778 4/29/2011 #3

如果您使用的是 Python 2.7 或 3.x,并且希望每个元素的出现次数,请使用 Counter

>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})

评论

4赞 Bram Vanroy 6/20/2018
我发现,当经常使用它(谈论数百万个字符串)时,它非常慢,因为它调用了 .因此,如果您确定正在处理的数据,最好编写一个自定义函数,而不进行类型和实例检查。isinstance
8赞 user2357112 11/14/2018
@BramVanroy:什么叫?即使有数百万个字符串,调用也只涉及一次调用,以检查其参数是否为映射。你很可能误判了你一直在吃什么。isinstanceCounterisinstance
1赞 Bram Vanroy 11/14/2018
你误解了我的意思:计数器在创建计数器之前检查你的数据类型。这需要相对较长的时间,并且如果您事先知道数据的类型。如果你看一下 Counter 的更新方法,你会发现它在做某事之前必须经过三个 if 语句。如果您经常调用更新,这会很快增加。当您能够控制数据并且知道输入确实是可迭代的时,则可以跳过前两次检查。正如我所说,我只是在处理数百万次更新时才注意到这一点,所以这是一个边缘情况。
9赞 user2357112 11/15/2018
@BramVanroy:如果你要执行数百万次更新,而不仅仅是计算数百万个字符串,那就另当别论了。优化工作已经投入到计算大型可迭代对象上,而不是计算许多可迭代对象上。计算一百万个字符串的可迭代对象将比手动实现更快。如果要调用多个可迭代对象,可以通过将它们连接到一个可迭代对象中来加快速度。CounterCounterupdateitertools.chain
17赞 Javi 12/22/2020
如果您想对结果进行排序 how-to-sort-counter-by-value-python --> x = Counter({'a':5, 'b':3, 'c':7}) x.most_common()
13赞 Wes Turner 8/14/2011 #4
# Python >= 2.6 (defaultdict) && < 2.7 (Counter, OrderedDict)
from collections import defaultdict
def count_unsorted_list_items(items):
    """
    :param items: iterable of hashable items to count
    :type items: iterable

    :returns: dict of counts like Py2.7 Counter
    :rtype: dict
    """
    counts = defaultdict(int)
    for item in items:
        counts[item] += 1
    return dict(counts)


# Python >= 2.2 (generators)
def count_sorted_list_items(items):
    """
    :param items: sorted iterable of items to count
    :type items: sorted iterable

    :returns: generator of (item, count) tuples
    :rtype: generator
    """
    if not items:
        return
    elif len(items) == 1:
        yield (items[0], 1)
        return
    prev_item = items[0]
    count = 1
    for item in items[1:]:
        if prev_item == item:
            count += 1
        else:
            yield (prev_item, count)
            count = 1
            prev_item = item
    yield (item, count)
    return


import unittest
class TestListCounters(unittest.TestCase):
    def test_count_unsorted_list_items(self):
        D = (
            ([], []),
            ([2], [(2,1)]),
            ([2,2], [(2,2)]),
            ([2,2,2,2,3,3,5,5], [(2,4), (3,2), (5,2)]),
            )
        for inp, exp_outp in D:
            counts = count_unsorted_list_items(inp) 
            print inp, exp_outp, counts
            self.assertEqual(counts, dict( exp_outp ))

        inp, exp_outp = UNSORTED_WIN = ([2,2,4,2], [(2,3), (4,1)])
        self.assertEqual(dict( exp_outp ), count_unsorted_list_items(inp) )


    def test_count_sorted_list_items(self):
        D = (
            ([], []),
            ([2], [(2,1)]),
            ([2,2], [(2,2)]),
            ([2,2,2,2,3,3,5,5], [(2,4), (3,2), (5,2)]),
            )
        for inp, exp_outp in D:
            counts = list( count_sorted_list_items(inp) )
            print inp, exp_outp, counts
            self.assertEqual(counts, exp_outp)

        inp, exp_outp = UNSORTED_FAIL = ([2,2,4,2], [(2,3), (4,1)])
        self.assertEqual(exp_outp, list( count_sorted_list_items(inp) ))
        # ... [(2,2), (4,1), (2,1)]

评论

2赞 Wes Turner 8/21/2011
@plaes : 怎么会这样?如果“enterprisey”是指“记录”,为准备 Py3k 注释做准备,我同意。
1赞 Adam Lewis 2/28/2013
这是一个很好的例子,因为我主要在 2.7 中开发,但必须有迁移到 2.4 的路径。
6赞 eyquem 8/14/2011 #5

要计算具有共同类型的不同元素的数量,请执行以下操作:

li = ['A0','c5','A8','A2','A5','c2','A3','A9']

print sum(1 for el in li if el[0]=='A' and el[1] in '01234')

3,而不是 6

评论

0赞 ljden 4/11/2022
你也可以把它写成sum(bool(el[0]=='A' and el[1] in '01234') for el in li)
86赞 tj80 10/21/2011 #6

获取字典中每个项的出现次数的另一种方法:

dict((i, a.count(i)) for i in a)

评论

61赞 Nicolas78 10/10/2012
这看起来像是我在激烈的战斗中经常想出的构造之一,但它将运行一个 len(a) 次,这意味着二次运行时复杂度(因为每次运行都再次依赖于 len(a)。
6赞 hugo24 8/23/2013
dict((i,a.count(i)) for i in set(a)) 会更正确、更快吗?
9赞 Clément 10/7/2013
@hugo24:有一点,但在最坏的情况下,它不会渐近地快;这将需要操作,不包括构建集合所需的时间。使用真的好多了。n * (number of different items)collections.Counter
0赞 rp1 9/16/2019
很晚了,但如果列表包含多个 的实例,以下代码不会抛出错误,因为它会尝试在字典中输入多个相同值的键。idict((i, a.count(i)) for i in a)
0赞 xuiqzy 11/16/2020
@rp1您可以自己尝试一下,并看到后面的键值对只是覆盖同一键的前一个条目,例如返回dict([(1, 2), (1, 3)]){1: 3}
15赞 D Blanc 11/8/2011 #7

我今天遇到了这个问题,在我想检查 SO 之前推出了我自己的解决方案。这:

dict((i,a.count(i)) for i in a)

对于大型列表来说,真的非常非常慢。我的解决方案

def occurDict(items):
    d = {}
    for i in items:
        if i in d:
            d[i] = d[i]+1
        else:
            d[i] = 1
return d

实际上比 Counter 解决方案快一点,至少对于 Python 2.7 来说是这样。

评论

1赞 chaosflaws 6/9/2015
计数器对条目进行排序,而您的计数器则不排序,因此速度差异(在撰写本文时为真,不确定是否是您写答案时。不过,它可能与向下滚动的人有关。
7赞 Martijn Pieters 4/23/2017
Python 2 中的计数器有点慢,是的。然而,它使用 C 优化的代码在 Python 3 中进行计数,现在可以轻松击败您的循环。
43赞 flonk 11/19/2013 #8

如果你想一次计算所有值,你可以使用 numpy 数组非常快速地完成,如下所示bincount

import numpy as np
a = np.array([1, 2, 3, 4, 1, 4, 1])
np.bincount(a)

这给了

>>> array([0, 3, 1, 1, 2])

评论

0赞 Rainald62 11/11/2022
缺点:仅适用于非负 s,并且它还计算所有“缺失值”,因此结果的大小是 ,即使只包含今天的儒略日,2459893也是相当大的。bincountint1+ max(a)a
363赞 user2314737 5/28/2014 #9

计算列表中一个项目的出现次数

对于仅计算一个列表项的出现次数,您可以使用count()

>>> l = ["a","b","b"]
>>> l.count("a")
1
>>> l.count("b")
2

对列表中所有项目的出现次数进行计数也称为“计数”列表或创建计数计数器。

使用 count() 计算所有项目

要计算一个项目中的出现次数,只需使用列表推导式和方法即可lcount()

[[x,l.count(x)] for x in set(l)]

(或类似字典dict((x,l.count(x)) for x in set(l)))

例:

>>> l = ["a","b","b"]
>>> [[x,l.count(x)] for x in set(l)]
[['a', 1], ['b', 2]]
>>> dict((x,l.count(x)) for x in set(l))
{'a': 1, 'b': 2}

使用 Counter() 计算所有项目

或者,库中有更快的类Countercollections

Counter(l)

例:

>>> l = ["a","b","b"]
>>> from collections import Counter
>>> Counter(l)
Counter({'b': 2, 'a': 1})

计数器的速度有多快?

我检查了统计列表的速度有多快。我用几个值尝试了这两种方法,似乎更快,常数系数约为 2。CounternCounter

这是我使用的脚本:

from __future__ import print_function
import timeit

t1=timeit.Timer('Counter(l)', \
                'import random;import string;from collections import Counter;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
                )

t2=timeit.Timer('[[x,l.count(x)] for x in set(l)]',
                'import random;import string;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
                )

print("Counter(): ", t1.repeat(repeat=3,number=10000))
print("count():   ", t2.repeat(repeat=3,number=10000)

输出:

Counter():  [0.46062711701961234, 0.4022796869976446, 0.3974247490405105]
count():    [7.779430688009597, 7.962715800967999, 8.420845870045014]

评论

50赞 fhucho 11/12/2015
Counter对于更大的列表来说要快得多。列表推导方法是 O(n^2),应该是 O(n)。Counter
45赞 Martijn Pieters 5/23/2017
计数器不会快 2 倍,计数器会快 n 倍(O(n^2) vs O(n))。
2赞 Bram Vanroy 6/20/2018
我发现,当经常使用它(谈论数百万个字符串)时,它非常慢,因为它调用了 .因此,如果您确定正在处理的数据,最好编写一个自定义函数,而不进行类型和实例检查。isinstance
72赞 Russia Must Remove Putin 4/13/2016 #10

给定一个项目,如何在 Python 的列表中计算它的出现次数?

下面是一个示例列表:

>>> l = list('aaaaabbbbcccdde')
>>> l
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'e']

list.count

有方法list.count

>>> l.count('b')
4

这适用于任何列表。元组也有这个方法:

>>> t = tuple('aabbbffffff')
>>> t
('a', 'a', 'b', 'b', 'b', 'f', 'f', 'f', 'f', 'f', 'f')
>>> t.count('f')
6

collections.Counter

然后是收藏。计数器。您可以将任何可迭代对象转储到计数器中,而不仅仅是列表,并且计数器将保留元素计数的数据结构。

用法:

>>> from collections import Counter
>>> c = Counter(l)
>>> c['b']
4

计数器基于 Python 字典,它们的键是元素,因此键需要是可散列的。它们基本上就像允许冗余元素进入它们的集合。

进一步使用collections.Counter

您可以使用计数器中的可迭代对象进行加法或减法:

>>> c.update(list('bbb'))
>>> c['b']
7
>>> c.subtract(list('bbb'))
>>> c['b']
4

您也可以使用计数器进行多集操作:

>>> c2 = Counter(list('aabbxyz'))
>>> c - c2                   # set difference
Counter({'a': 3, 'c': 3, 'b': 2, 'd': 2, 'e': 1})
>>> c + c2                   # addition of all elements
Counter({'a': 7, 'b': 6, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c | c2                   # set union
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c & c2                   # set intersection
Counter({'a': 2, 'b': 2})

愚蠢的答案,求和

有很好的内置答案,但这个例子有点启发性。在这里,我们求和字符 c 等于的所有出现:'b'

>>> sum(c == 'b' for c in l)
4

对于这个用例来说不是很好,但如果你需要对情况进行可迭代计数,那么对布尔结果求和是完全可以的,因为它等价于 。TrueTrue1

为什么不是熊猫?

另一个答案建议:

为什么不使用熊猫?

Pandas 是一个通用库,但它不在标准库中。将其添加为要求并非易事。

在列表对象本身以及标准库中都有针对此用例的内置解决方案。

如果您的项目还没有 pandas,那么仅将其作为此功能的要求是愚蠢的。

评论

8赞 jpp 1/3/2019
虽然“为什么不是 Pandas”是合适的,但它可能应该伴随着“何时使用 NumPy”,即对于大型数值数组。决定性因素不仅仅是项目限制,还有 NumPy 的内存效率,这在大数据中变得很明显。
2赞 Marc 11/13/2019
感谢您提到 Pandas/etc 是一个严重的依赖项。其中一些软件包具有负面副作用。因此,为琐碎的需求添加这些资产可能会花费大量时间和美元。就我个人而言,我经历过 Numpy 和 SciPi 为我们的 CI 管道增加了 30 分钟,并且花了几天时间才能正确获得包缓存。很棒的套餐,但有时也有隐藏的费用。+1'd
6赞 vishes_shell 9/19/2016 #11

您还可以使用内置模块运算符countOf 方法。

>>> import operator
>>> operator.countOf([1, 2, 3, 4, 1, 4, 1], 1)
3

评论

2赞 Chris_Rands 5/23/2017
是如何实施的?它与更明显的(受益于 C 实现)相比如何?有什么优势吗?countOflist.count
29赞 Shoresh 10/18/2016 #12

为什么不使用 Pandas?

import pandas as pd

my_list = ['a', 'b', 'c', 'd', 'a', 'd', 'a']

# converting the list to a Series and counting the values
my_count = pd.Series(my_list).value_counts()
my_count

输出:

a    3
d    2
b    1
c    1
dtype: int64

如果您正在寻找特定元素的计数,例如 a,请尝试:

my_count['a']

输出:

3
2赞 whackamadoodle3000 8/23/2017 #13
sum([1 for elem in <yourlist> if elem==<your_value>])

这将返回 your_value 的发生次数

61赞 Nico Schlömer 9/13/2017 #14

我已经将所有建议的解决方案(以及一些新的解决方案)与 perfplot(我的一个小项目)进行了比较。

计算一个项目

事实证明,对于足够大的数组,

numpy.sum(numpy.array(a) == 1)

比其他解决方案略快。

enter image description here

清点所有项目

如前所述

numpy.bincount(a)

是你想要的。

enter image description here


用于重现绘图的代码:

from collections import Counter
from collections import defaultdict
import numpy
import operator
import pandas
import perfplot


def counter(a):
    return Counter(a)


def count(a):
    return dict((i, a.count(i)) for i in set(a))


def bincount(a):
    return numpy.bincount(a)


def pandas_value_counts(a):
    return pandas.Series(a).value_counts()


def occur_dict(a):
    d = {}
    for i in a:
        if i in d:
            d[i] = d[i]+1
        else:
            d[i] = 1
    return d


def count_unsorted_list_items(items):
    counts = defaultdict(int)
    for item in items:
        counts[item] += 1
    return dict(counts)


def operator_countof(a):
    return dict((i, operator.countOf(a, i)) for i in set(a))


perfplot.show(
    setup=lambda n: list(numpy.random.randint(0, 100, n)),
    n_range=[2**k for k in range(20)],
    kernels=[
        counter, count, bincount, pandas_value_counts, occur_dict,
        count_unsorted_list_items, operator_countof
        ],
    equality_check=None,
    logx=True,
    logy=True,
    )
from collections import Counter
from collections import defaultdict
import numpy
import operator
import pandas
import perfplot


def counter(a):
    return Counter(a)


def count(a):
    return dict((i, a.count(i)) for i in set(a))


def bincount(a):
    return numpy.bincount(a)


def pandas_value_counts(a):
    return pandas.Series(a).value_counts()


def occur_dict(a):
    d = {}
    for i in a:
        if i in d:
            d[i] = d[i] + 1
        else:
            d[i] = 1
    return d


def count_unsorted_list_items(items):
    counts = defaultdict(int)
    for item in items:
        counts[item] += 1
    return dict(counts)


def operator_countof(a):
    return dict((i, operator.countOf(a, i)) for i in set(a))


b = perfplot.bench(
    setup=lambda n: list(numpy.random.randint(0, 100, n)),
    n_range=[2 ** k for k in range(20)],
    kernels=[
        counter,
        count,
        bincount,
        pandas_value_counts,
        occur_dict,
        count_unsorted_list_items,
        operator_countof,
    ],
    equality_check=None,
)
b.save("out.png")
b.show()

评论

11赞 Mukarram Pasha 3/3/2018
numpy.bincount() 仅适用于带有 int 项的列表。
0赞 Kelly Bundy 2/7/2022
第一个程序实际上并不测量计算一个项目,是吗?看起来它正在做与第二个程序相同的操作。你能检查/修复吗?我认为会更好。有了你的,你在 Python 列表中有 NumPy ints,这似乎很奇怪/不切实际。numpy.random.randint(0, 100, n).tolist()list(numpy.random.randint(0, 100, n))
28赞 Thirupathi Thangavel 1/17/2018 #15

如果你能用,那么就是救援的。pandasvalue_counts

>>> import pandas as pd
>>> a = [1, 2, 3, 4, 1, 4, 1]
>>> pd.Series(a).value_counts()
1    3
4    2
3    1
2    1
dtype: int64

它还会自动根据频率对结果进行排序。

如果您希望结果出现在列表中,请执行以下操作

>>> pd.Series(a).value_counts().reset_index().values.tolist()
[[1, 3], [4, 2], [3, 1], [2, 1]]

评论

1赞 endolith 8/20/2019
不过,Pandas 的开销很大,因此它是数据量较小的最慢解决方案。stackoverflow.com/a/46195192/125507
4赞 blue-sky 3/1/2018 #16

可能不是最有效的,需要额外的通行证才能删除重复项。

功能实现:

arr = np.array(['a','a','b','b','b','c'])
print(set(map(lambda x  : (x , list(arr).count(x)) , arr)))

返回:

{('c', 1), ('b', 3), ('a', 2)}

或返回为 :dict

print(dict(map(lambda x  : (x , list(arr).count(x)) , arr)))

返回:

{'b': 3, 'c': 1, 'a': 2}
-2赞 ravi tanwar 7/7/2018 #17
def countfrequncyinarray(arr1):
    r=len(arr1)
    return {i:arr1.count(i) for i in range(1,r+1)}
arr1=[4,4,4,4]
a=countfrequncyinarray(arr1)
print(a)

评论

5赞 Alex Riabov 7/7/2018
虽然此代码可以回答该问题,但提供有关此代码为什么和/或如何回答该问题的其他上下文可以提高其长期价值。
0赞 MisterMiyagi 7/30/2022
此解决方案实际上不起作用;输入必须以非常具体的方式构建才能看似有效。例如,将无法计算 s。只是没有办法构造一个输入来计算一个 或类似的条目。countfrequncyinarray([4, 4, 4])4-1sys.maxsize + 1
9赞 Andreas K. 10/22/2018 #18

建议使用 numpy 的 bincount,但它仅适用于具有非负整数的一维数组。此外,生成的数组可能会令人困惑(它包含原始列表从最小值到最大值的整数出现次数,并将缺失的整数设置为 0)。

使用 numpy 的更好方法是使用属性设置为 True 的唯一函数。它返回一个元组,其中包含唯一值的数组和每个唯一值的出现数组。return_counts

# a = [1, 1, 0, 2, 1, 0, 3, 3]
a_uniq, counts = np.unique(a, return_counts=True)  # array([0, 1, 2, 3]), array([2, 3, 1, 2]

然后我们可以将它们配对为

dict(zip(a_uniq, counts))  # {0: 2, 1: 3, 2: 1, 3: 2}

它还适用于其他数据类型和“二维列表”,例如

>>> a = [['a', 'b', 'b', 'b'], ['a', 'c', 'c', 'a']]
>>> dict(zip(*np.unique(a, return_counts=True)))
{'a': 3, 'b': 3, 'c': 2}
14赞 Tim Skov Jacobsen 10/30/2018 #19

所有元素的计数itertools.groupby()

获取列表中所有元素计数的 Antoher 可能性可以通过 .itertools.groupby()

具有“重复”计数

from itertools import groupby

L = ['a', 'a', 'a', 't', 'q', 'a', 'd', 'a', 'd', 'c']  # Input list

counts = [(i, len(list(c))) for i,c in groupby(L)]      # Create value-count pairs as list of tuples 
print(counts)

返回

[('a', 3), ('t', 1), ('q', 1), ('a', 1), ('d', 1), ('a', 1), ('d', 1), ('c', 1)]

请注意它如何将前三个 '组合为第一组,而其他组则出现在列表的下方。发生这种情况的原因是输入列表未排序。如果组实际上应该是分开的,这有时可能是一个好处。aaL

具有唯一计数

如果需要唯一组计数,只需对输入列表进行排序:

counts = [(i, len(list(c))) for i,c in groupby(sorted(L))]
print(counts)

返回

[('a', 5), ('c', 1), ('d', 2), ('q', 1), ('t', 1)]

注意:为了创建唯一计数,与解决方案相比,许多其他答案提供了更简单、更易读的代码。但此处显示的是与重复计数示例的平行关系。groupby

12赞 Akash Swain 11/2/2018 #20

以下是三种解决方案:

最快的方法是使用 for 循环并将其存储在 Dict 中。

import time
from collections import Counter


def countElement(a):
    g = {}
    for i in a:
        if i in g: 
            g[i] +=1
        else: 
            g[i] =1
    return g


z = [1,1,1,1,2,2,2,2,3,3,4,5,5,234,23,3,12,3,123,12,31,23,13,2,4,23,42,42,34,234,23,42,34,23,423,42,34,23,423,4,234,23,42,34,23,4,23,423,4,23,4]


#Solution 1 - Faster
st = time.monotonic()
for i in range(1000000):
    b = countElement(z)
et = time.monotonic()
print(b)
print('Simple for loop and storing it in dict - Duration: {}'.format(et - st))

#Solution 2 - Fast
st = time.monotonic()
for i in range(1000000):
    a = Counter(z)
et = time.monotonic()
print (a)
print('Using collections.Counter - Duration: {}'.format(et - st))

#Solution 3 - Slow
st = time.monotonic()
for i in range(1000000):
    g = dict([(i, z.count(i)) for i in set(z)])
et = time.monotonic()
print(g)
print('Using list comprehension - Duration: {}'.format(et - st))

结果

#Solution 1 - Faster
{1: 4, 2: 5, 3: 4, 4: 6, 5: 2, 234: 3, 23: 10, 12: 2, 123: 1, 31: 1, 13: 1, 42: 5, 34: 4, 423: 3}
Simple for loop and storing it in dict - Duration: 12.032000000000153
#Solution 2 - Fast
Counter({23: 10, 4: 6, 2: 5, 42: 5, 1: 4, 3: 4, 34: 4, 234: 3, 423: 3, 5: 2, 12: 2, 123: 1, 31: 1, 13: 1})
Using collections.Counter - Duration: 15.889999999999418
#Solution 3 - Slow
{1: 4, 2: 5, 3: 4, 4: 6, 5: 2, 34: 4, 423: 3, 234: 3, 42: 5, 12: 2, 13: 1, 23: 10, 123: 1, 31: 1}
Using list comprehension - Duration: 33.0

评论

0赞 Kishan K 11/23/2020
而是使用上面解决方案中提到的计数器@user52028778
2赞 Akash Swain 11/24/2020
@KishanK 如果您看到我的答案,我也尝试过 Counter(解决方案 2),但使用循环的 Solution1 仍然比它运行得更快。
0赞 loco.loop 9/15/2021
@AkashSwain 在您实现的方法中,我想您可以通过从列表中删除已经计数的元素来使其运行得更快一些,因为 for 循环不必检查这些元素......我会复制列表,然后从复制的列表中删除并执行 for 循环,我想您也必须以相反的顺序进行循环,因为您将从列表中删除内容......
14赞 Harsh Gundecha 7/4/2019 #21

虽然这是一个很老的问题,但由于我没有找到一个衬里,所以我做了一个。

# original numbers in list
l = [1, 2, 2, 3, 3, 3, 4]

# empty dictionary to hold pair of number and its count
d = {}

# loop through all elements and store count
[ d.update( {i:d.get(i, 0)+1} ) for i in l ]

print(d)
# {1: 1, 2: 2, 3: 3, 4: 1}

评论

3赞 Georgy 7/4/2019
不要使用列表推导式来表示副作用。请参阅:仅针对副作用使用列表推导式是 Python 吗?
5赞 IPython 1/29/2020 #22

我会用 ,以 Lukasz 的例子为例:filter()

>>> lst = [1, 2, 3, 4, 1, 4, 1]
>>> len(filter(lambda x: x==1, lst))
3

评论

0赞 yozniak 6/11/2020
这会在 python 3.5 中引发异常“对象过滤器没有 len()”
0赞 IPython 7/15/2020
在 Python 3 中,您必须使用 list() 将过滤器对象转换为列表。
4赞 Fatemeh Asgarinejad 9/19/2020 #23

给定一个列表 X

 import numpy as np
 X = [1, -1, 1, -1, 1]

显示此列表元素的 i: frequency(i) 的字典是:

{i:X.count(i) for i in np.unique(X)}

输出:

{-1: 2, 1: 3}

评论

0赞 Pavel Gurkov 3/2/2021
numpy 在创建列表时是否以智能方式预先计算?如果不是,则为 O(n^2)。
0赞 MisterMiyagi 7/30/2022
这里没有必要使用 numpy。 以更通用的方式提供相同的功能,无需外部依赖。set
5赞 Golden Lion 1/31/2021 #24

使用 %timeit 查看哪个操作效率更高。np.array 计数操作应该更快。

 from collections import Counter
 mylist = [1,7,7,7,3,9,9,9,7,9,10,0] 
 types_counts=Counter(mylist)
 print(types_counts)
-1赞 ash 3/16/2021 #25
test = [409.1, 479.0, 340.0, 282.4, 406.0, 300.0, 374.0, 253.3, 195.1, 269.0, 329.3, 250.7, 250.7, 345.3, 379.3, 275.0, 215.2, 300.0]

for i in test:
    print('{} numbers {}'.format(i, test.count(i)))
3赞 Abel Rodríguez 5/2/2021 #26

或者,您也可以自己实现计数器。我是这样做的:

item_list = ['me', 'me', 'you', 'you', 'you', 'they']

occ_dict = {}

for item in item_list:
    if item not in occ_dict:
        occ_dict[item] = 1
    else:
        occ_dict[item] +=1

print(occ_dict)

输出:{'me': 2, 'you': 3, 'they': 1}

4赞 ben othman zied 1/21/2022 #27
mot = ["compte", "france", "zied"]
lst = ["compte", "france", "france", "france", "france"]
dict((x, lst.count(x)) for x in set(mot))

这给了

{'compte': 1, 'france': 4, 'zied': 0}

评论

0赞 sean 5/23/2022
这对我有用,尽管由于 set 函数,额外的重复数据删除的“mot”变量是多余的,所以这也有效: lst = [“compte”, “france”, “france”, “france”, “france”] dict((x, lst.count(x)) for x in set(lst))
-1赞 Mehdi Fekih 4/6/2022 #28
import pandas as pd
test = [409.1, 479.0, 340.0, 282.4, 406.0, 300.0, 374.0, 253.3, 195.1, 269.0, 329.3, 250.7, 250.7, 345.3, 379.3, 275.0, 215.2, 300.0]

#turning the list into a temporary dataframe
test  = pd.DataFrame(test)

#using the very convenient value_counts() function
df_counts = test.value_counts()
df_counts

然后,您可以使用并获取数据。df_counts.indexdf_counts.values

-1赞 LunaticXXD10 4/25/2022 #29
x = ['Jess', 'Jack', 'Mary', 'Sophia', 'Karen',
     'Addison', 'Joseph','Jack', 'Jack', 'Eric', 'Ilona', 'Jason']
the_item = input('Enter the item that you wish to find : ')
how_many_times = 0 
for occurrence in x:
     if occurrence == the_item : 
          how_many_times += 1
print('The occurrence of', the_item, 'in', x,'is',how_many_times) 

创建了一个名称列表,其中重复了名称“Jack”。 为了检查它的发生率,我在名为 . 在每次迭代中,如果循环变量获得的值与从用户那里收到并存储在变量中的值相同,则该变量将递增 1。 在获得一些价值之后......我们打印存储单词“jack”出现的值xthe_itemhow_many_timeshow_many_times

-2赞 Nathindu Himansha 2/25/2023 #30

如果您只想获取单个项目的计数,请使用 python 内置计数方法:

list = [2,5,4,3,10,3,5,6,5]
elmenet_count = list.count(5)
print('The count of element 5 is ', elmenet_count )

输出:

The count of element 5 is 3

评论

1赞 MisterMiyagi 2/25/2023
公认的答案已经暗示了这一点。这个答案补充了什么?