2098 votes

Comment puis-je compter les occurrences d'un élément de liste ?

Étant donné un élément, comment puis-je compter ses occurrences dans une liste en Python ?

2446voto

Łukasz Points 5614

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

Important : cela est très lent si vous comptez multiple différents éléments

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.

19 votes

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

2355voto

user52028778 Points 4019

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

4 votes

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.

8 votes

@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.

1 votes

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.

354voto

user2314737 Points 1671

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]

50 votes

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

45 votes

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

2 votes

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.

84voto

tj80 Points 201

Une autre façon d'obtenir le nombre d'occurrences de chaque élément, dans un dictionnaire :

dict((i, a.count(i)) for i in a)

60 votes

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

6 votes

Est-ce que dict((i,a.count(i)) for i in set(a)) serait plus correct et plus rapide ?

9 votes

@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.

56voto

Silfverstrom Points 8132

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.com

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.

Powered by:

X