web-dev-qa-db-fra.com

Le moyen le plus rapide de compter le nombre d'occurrences dans une liste Python

J'ai une liste Python et je veux savoir quel est le moyen le plus rapide de compter le nombre d'occurrences de l'élément, '1', dans cette liste. Dans mon cas réel, l'élément peut apparaître des dizaines de milliers de fois, c'est pourquoi je souhaite un moyen rapide.

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

Le module collections aide-t-il? J'utilise Python 2.7

35
prrao
a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
print a.count("1")

Il est probablement fortement optimisé au niveau C.

Edit: J'ai généré de manière aléatoire une grande liste. 

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

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

Éditer Éditer: Cela pourrait être fait avec collections.Counter

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

Utiliser la même liste dans mon dernier exemple de chronométrage

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

Mon timing est simpliste et dépend de nombreux facteurs, mais il vous donne un bon indice quant à la performance.

Voici quelques profils

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}
68
Jakob Bowyer

En utilisant Counter dictionary comptant les occurrences de tous les éléments ainsi que l’élément le plus courant dans la liste python avec sa valeur d’occurrence de la manière la plus efficace.

Si notre liste python est: -

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

Pour rechercher l'occurrence de tous les éléments de la liste python, utilisez les éléments suivants: -

\>>from collections import Counter

\>>c=Counter(l)

\>>print c

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

Pour trouver l'occurrence la plus élevée/la plus élevée d'éléments dans la liste python: -

\>>k=c.most_common()

\>>k

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

Pour le plus haut : -

\>>k[0][1]

6

Pour l'élément, utilisez simplement k [0] [0]

\>>k[0][0]

'1'

Pour le nième élément le plus élevé et son nombre d’occurrences dans la liste, utilisez: -

** pour n = 2 **

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

2

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

4
12
Surya Prakash Singh

La combinaison des fonctions lambda et map peut également faire le travail:

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

Vous pouvez utiliser pandas, en transformant la list en un pd.Series puis utilisez simplement .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)
0
J. Doe