计算 Python 列表中出现次数的最快方法

Posted

技术标签:

【中文标题】计算 Python 列表中出现次数的最快方法【英文标题】:Fastest way to count number of occurrences in a Python list 【发布时间】:2012-09-09 06:44:26 【问题描述】:

我有一个 Python 列表,我想知道在此列表中计算项目出现次数的最快方法是什么,'1'。在我的实际情况中,该项目可能会出现数万次,这就是我想要快速方式的原因。

['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']

哪种方法:.countcollections.Counter 可能更优化?

【问题讨论】:

列表总是排序的吗?你总是数第一项吗? How to calculate the occurrences of a list item in Python? 的可能重复项 @JoshCaswell 不,列表未排序,我会计算任何项目。我不确定哪种方法:countcollections.Counter 优化得更好,这就是我问的原因 @prrao 取决于您是否要多次执行此操作。 @jamylak 是的,我想为多个项目多次执行此操作。 【参考方案1】:
a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
print a.count("1")

它可能在 C 级别进行了大量优化。

编辑:我随机生成了一个大列表。

In [8]: len(a)
Out[8]: 6339347

In [9]: %timeit a.count("1")
10 loops, best of 3: 86.4 ms per loop

编辑编辑:这可以通过collections.Counter 完成

a = Counter(your_list)
print a['1']

在我上一个计时示例中使用相同的列表

In [17]: %timeit Counter(a)['1']
1 loops, best of 3: 1.52 s per loop

我的时间安排过于简单,并且取决于许多不同的因素,但它可以为您提供有关性能的良好线索。

这是一些分析

In [24]: profile.run("a.count('1')")
         3 function calls in 0.091 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.091    0.091 <string>:1(<module>)
        1    0.091    0.091    0.091    0.091 method 'count' of 'list' objects

        1    0.000    0.000    0.000    0.000 method 'disable' of '_lsprof.Prof
iler' objects



In [25]: profile.run("b = Counter(a); b['1']")
         6339356 function calls in 2.143 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.143    2.143 <string>:1(<module>)
        2    0.000    0.000    0.000    0.000 _weakrefset.py:68(__contains__)
        1    0.000    0.000    0.000    0.000 abc.py:128(__instancecheck__)
        1    0.000    0.000    2.143    2.143 collections.py:407(__init__)
        1    1.788    1.788    2.143    2.143 collections.py:470(update)
        1    0.000    0.000    0.000    0.000 getattr
        1    0.000    0.000    0.000    0.000 isinstance
        1    0.000    0.000    0.000    0.000 method 'disable' of '_lsprof.Prof
iler' objects
  6339347    0.356    0.000    0.356    0.000 method 'get' of 'dict' objects

【讨论】:

您认为哪种方法优化得更好?我想更好的选择取决于大小写? @prrao。在这种情况下,count 比创建 Counter 快约 20 倍,但相同的 Counter 可用于以非常低的额外成本检索多个不同值的计数。如果您需要从同一个列表中计算 20 个或更多值,Counter 将比运行 .count() 20 次更有效 我正在处理 1,000,000 个整数的数据集,其中集合的范围是 100,即每个元素重复大约​​ 10,000 次。使用 Counter 而不是 .count 将我的时间缩短了一半。 +1 Counter 我正在处理一个包含 350,000 个字符串(url)的列表:使用 Counter 不到一秒钟,而我有时间喝一杯冰沙等待 .count() 完成,所以 +1再次为 Counter :) (事实上,我正在计算每个不同的 url,所以如前所述,在这种情况下最好使用 Counter)。 我一定错过了什么。使用 list[long] 数据集(包含 random.randint(0, sys.maxsize) 数字,最多 50M)`,尝试用相同的参数计算另一个 randint.contCounter(只尝试数一次)。另外,我切换到Counter 知道如何处理的generators,但组合时间(生成列表/生成器+计数)有利于list.countPython3Python2 的行为是一致的。【参考方案2】:

通过使用Counter字典以最有效的方式计算所有元素以及python列表中最常见元素的出现次数及其出现值。

如果我们的python列表是:-

l=['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']

要查找 python 列表中每个项目的出现,请使用以下命令:-

\>>from collections import Counter

\>>c=Counter(l)

\>>print c

Counter('1': 6, '2': 4, '7': 3, '10': 2)

在 python 列表中查找最多/最高出现的项目:-

\>>k=c.most_common()

\>>k

[('1', 6), ('2', 4), ('7', 3), ('10', 2)]

最高者:-

\>>k[0][1]

6

对于项目只需使用 k[0][0]

\>>k[0][0]

'1'

对于第 n 个最高的项目及其在列表中出现的次数,使用以下:-

**对于 n=2 **

\>>print k[n-1][0] # For item

2

\>>print k[n-1][1] # For value

4

【讨论】:

【参考方案3】:

您可以使用pandas,将list 转换为pd.Series,然后只需使用.value_counts()

import pandas as pd
a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
a_cnts = pd.Series(a).value_counts().to_dict()

Input  >> a_cnts["1"], a_cnts["10"]
Output >> (6, 2)

【讨论】:

【参考方案4】:

结合 lambda 和 map 函数也可以做到:

list_ = ['a', 'b', 'b', 'c']
sum(map(lambda x: x=="b", list_))
:2

【讨论】:

【参考方案5】:

您可以将列表转换为字符串,其中元素以空格分隔,并根据要搜索的数字/字符将其拆分..

对于大型列表将是干净和快速的..

>>>L = [2,1,1,2,1,3]
>>>strL = " ".join(str(x) for x in L)
>>>strL
2 1 1 2 1 3
>>>count=len(strL.split(" 1"))-1
>>>count
3

【讨论】:

以上是关于计算 Python 列表中出现次数的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

python2 怎么统计列表字符串出现次数

递归计算嵌套数字列表中的出现次数

Python统计列表中的重复项出现的次数的方法

Python 统计列表里面有多少个元素

python如何将列表中只出现一次的数字输出

如何计算熊猫系列列表中每个元素的出现次数?