Étant donné un élément, comment puis-je compter ses occurrences dans une liste en Python ?
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]))
Étant donné un élément, comment puis-je compter ses occurrences dans une liste en Python ?
Si vous ne voulez que le compte d'un seul élément, utilisez la fonction count
méthode :
>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3
Chaque count
passe en revue la liste complète des n
éléments. Appeler count
en boucle n
temps signifie n * n
total des contrôles, ce qui peut être catastrophique pour les performances.
Si vous voulez compter plusieurs éléments, utilisez Counter
qui ne fait que n
total des chèques.
Utilisez Counter
si vous utilisez Python 2.7 ou 3.x et que vous souhaitez obtenir le nombre d'occurrences pour chaque élément :
>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})
J'ai constaté qu'en l'utilisant souvent (en parlant de millions de chaînes de caractères), il est très lent à cause de ses appels à isinstance
. Ainsi, si vous êtes certain des données avec lesquelles vous travaillez, il peut être préférable d'écrire une fonction personnalisée sans vérification de type et d'instance.
@BramVanroy : Quoi isinstance
appels ? Même avec des millions de chaînes, appeler Counter
ne concerne qu'un seul isinstance
pour vérifier si son argument est un mapping. Vous avez probablement mal évalué ce qui mange tout votre temps.
Vous avez mal interprété ce que je voulais dire : Counter vérifie les types de vos données avant de créer le Counter. Cela prend relativement beaucoup de temps et si tu connais le type de tes données à l'avance. Si tu regardes la méthode de mise à jour de Counter, tu verras qu'elle doit passer par trois états if avant de faire quelque chose. Si vous appelez fréquemment update, cela s'accumule rapidement. Lorsque vous avez le contrôle de vos données et que vous connaître que l'entrée sera effectivement un itérable, alors vous pouvez sauter les deux premières vérifications. Comme je l'ai dit, je n'ai remarqué ce problème qu'en travaillant avec des millions de mises à jour, c'est donc un cas limite.
Compter les occurrences d'un élément dans une liste
Pour compter les occurrences d'un seul élément de la liste, vous pouvez utiliser count()
>>> l = ["a","b","b"]
>>> l.count("a")
1
>>> l.count("b")
2
En comptant les occurrences de tous Les éléments d'une liste sont également connus sous le nom de "pointage" d'une liste, ou de création d'un compteur de pointage.
Compter tous les éléments avec count()
Pour compter les occurrences des éléments dans l
on peut simplement utiliser une compréhension de liste et la fonction count()
méthode
[[x,l.count(x)] for x in set(l)]
(ou de manière similaire avec un dictionnaire dict((x,l.count(x)) for x in set(l))
)
Ejemplo:
>>> 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}
Compter tous les éléments avec Counter()
Sinon, il y a la solution plus rapide Counter
de la classe collections
bibliothèque
Counter(l)
Ejemplo:
>>> l = ["a","b","b"]
>>> from collections import Counter
>>> Counter(l)
Counter({'b': 2, 'a': 1})
Combien plus rapide est Counter ?
J'ai vérifié combien plus rapide Counter
sert à dresser des listes. J'ai essayé les deux méthodes avec quelques valeurs de n
et il apparaît que Counter
est plus rapide d'un facteur constant d'environ 2.
Voici le script que j'ai utilisé :
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)
Et le résultat :
Counter(): [0.46062711701961234, 0.4022796869976446, 0.3974247490405105]
count(): [7.779430688009597, 7.962715800967999, 8.420845870045014]
Counter
es chemin plus rapide pour les grandes listes. La méthode de compréhension des listes est O(n^2), Counter
devrait être O(n).
Counter n'est pas plus rapide d'un facteur 2, Counter est plus rapide d'un facteur 3. facteur de n (O(n^2) contre O(n)).
J'ai constaté qu'en l'utilisant souvent (en parlant de millions de chaînes de caractères), il est très lent à cause de ses appels à isinstance
. Ainsi, si vous êtes certain des données avec lesquelles vous travaillez, il peut être préférable d'écrire une fonction personnalisée sans vérification de type et d'instance.
Cela ressemble à l'une des constructions que j'invente souvent dans le feu de l'action, mais elle sera exécutée une fois len(a), ce qui signifie une complexité d'exécution quadratique (puisque chaque exécution dépend à nouveau de len(a)).
@hugo24 : Un peu, mais il ne sera pas asymptotiquement plus rapide dans le pire des cas ; il faudra n * (number of different items)
opérations, sans compter le temps nécessaire à la construction de l'ensemble. Utilisation de collections.Counter
est vraiment beaucoup mieux.
list.count(x)
renvoie le nombre de fois où x
apparaît dans une liste
voir : http://docs.python.org/tutorial/datastructures.html#more-on-lists
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.