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