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

prr*_*rao 40 python list repeat

我有一个Python列表,我想知道'1'在这个列表中计算项目出现次数的最快方法是什么.在我的实际情况中,该项目可以发生数万次,这就是为什么我想要一个快速的方式.

['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
Run Code Online (Sandbox Code Playgroud)

.count模块有帮助吗?我正在使用Python 2.7

Jak*_*yer 71

a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
print a.count("1")
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

a = Counter(your_list)
print a['1']
Run Code Online (Sandbox Code Playgroud)

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

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

我的时间过于简单化,并且取决于许多不同的因素,但它为您提供了一个关于性能的良好线索.

这是一些分析

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}
Run Code Online (Sandbox Code Playgroud)

  • @prrao.在这种情况下,`count`比创建`Counter`快约20倍,但同样的`Counter`可用于以非常低的额外成本检索多个不同值的计数.如果你需要从同一个列表中计算20个或更多的值,`Counter`将比运行`.count()`20次更有效 (14认同)
  • 我正在处理1,000,000个整数的数据集,其中集合的范围是100,即每个元素重复大约​​10,000次.使用`Counter`而不是`.count`将我的时间缩短了一半."Counter"为+1. (3认同)
  • 我正在处理 350,000 个字符串(url)的列表:使用 Counter 花了不到一秒钟,而我有时间喝一杯冰沙等待 .count() 完成,所以 Counter 再次 +1 :) (事实上,我正在计算每个不同的 url,因此,如前所述,在这种情况下最好使用 Counter)。 (2认同)

小智 13

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

如果我们的python列表是: -

l=['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
Run Code Online (Sandbox Code Playgroud)

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

\>>from collections import Counter

\>>c=Counter(l)

\>>print c

Counter({'1': 6, '2': 4, '7': 3, '10': 2})
Run Code Online (Sandbox Code Playgroud)

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

\>>k=c.most_common()

\>>k

[('1', 6), ('2', 4), ('7', 3), ('10', 2)]
Run Code Online (Sandbox Code Playgroud)

最高的一个: -

\>>k[0][1]

6
Run Code Online (Sandbox Code Playgroud)

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

\>>k[0][0]

'1'
Run Code Online (Sandbox Code Playgroud)

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

**对于n = 2**

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

2

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

4
Run Code Online (Sandbox Code Playgroud)