Étant donné un élément, comment puis-je compter ses occurrences dans une liste en Python?
1530
Si vous ne souhaitez compter qu'un seul élément, utilisez la count
méthode:
>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3
Ne l' utilisez pas si vous souhaitez compter plusieurs éléments. L'appel count
en boucle nécessite un passage distinct sur la liste pour chaque count
appel, ce qui peut être catastrophique pour les performances. Si vous souhaitez compter tous les éléments, ou même seulement plusieurs éléments, utilisez Counter
, comme expliqué dans les autres réponses.
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]))
A utiliser
Counter
si vous utilisez Python 2.7 ou 3.x et que vous souhaitez le nombre d'occurrences pour chaque élément:la source
isinstance
. Donc, 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.isinstance
appels? Même avec des millions de chaînes, l'appelCounter
ne comporte qu'un seulisinstance
appel, pour vérifier si son argument est un mappage. Vous avez probablement mal évalué ce que vous mangez tout votre temps.Counter
a consisté à compter de grands itérables, plutôt que de compter de nombreux itérables. Compter un million de chaînes itérables ira plus viteCounter
qu'avec une implémentation manuelle. Si vous souhaitez appelerupdate
avec de nombreux itérables, vous pouvez accélérer les choses en les joignant en un seul itérable avecitertools.chain
.Compter les occurrences d'un élément dans une liste
Pour compter les occurrences d'un seul élément de liste, vous pouvez utiliser
count()
Le comptage des occurrences de tous les éléments d'une liste est également appelé «comptage» d'une liste ou création d'un compteur de comptage.
Compter tous les éléments avec count ()
Pour compter les occurrences d'éléments en
l
un, il suffit d'utiliser une compréhension de liste et lacount()
méthode(ou de même avec un dictionnaire
dict((x,l.count(x)) for x in set(l))
)Exemple:
Compter tous les éléments avec Counter ()
Alternativement, il y a la
Counter
classe la plus rapide de lacollections
bibliothèqueExemple:
Combien est plus rapide Counter?
J'ai vérifié à quel point les
Counter
listes de comptage sont plus rapides . J'ai essayé les deux méthodes avec quelques valeurs den
et il semble que ceCounter
soit plus rapide d'un facteur constant d'environ 2.Voici le script que j'ai utilisé:
Et la sortie:
la source
Counter
est beaucoup plus rapide pour les plus grandes listes. La méthode de compréhension de la liste est O (n ^ 2),Counter
devrait être O (n).isinstance
. Donc, 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.Une autre façon d'obtenir le nombre d'occurrences de chaque élément, dans un dictionnaire:
la source
n * (number of different items)
opérations, sans compter le temps qu'il faut pour construire l'ensemble. L'utilisationcollections.Counter
est vraiment bien meilleure.i
, car il essaiera d'entrer plusieurs clés de même valeur dans un dictionnaire.dict((i, a.count(i)) for i in a)
list.count(x)
renvoie le nombre de foisx
apparaît dans une listevoir: http://docs.python.org/tutorial/datastructures.html#more-on-lists
la source
Voici un exemple de liste:
list.count
Voilà la
list.count
méthodeCela fonctionne bien pour n'importe quelle liste. Les tuples ont également cette méthode:
collections.Counter
Et puis il y a les collections. Vous pouvez vider tout itérable dans un compteur, pas seulement une liste, et le compteur conservera une structure de données des décomptes des éléments.
Usage:
Les compteurs sont basés sur des dictionnaires Python, leurs clés sont les éléments, donc les clés doivent être lavables. Ils sont essentiellement comme des ensembles qui autorisent des éléments redondants.
Utilisation ultérieure de
collections.Counter
Vous pouvez ajouter ou soustraire avec des itérables de votre compteur:
Et vous pouvez également effectuer des opérations multi-ensembles avec le compteur:
Pourquoi pas des pandas?
Une autre réponse suggère:
Pandas est une bibliothèque commune, mais elle n'est pas dans la bibliothèque standard. L'ajouter en tant qu'exigence n'est pas anodin.
Il existe des solutions intégrées pour ce cas d'utilisation dans l'objet liste lui-même ainsi que dans la bibliothèque standard.
Si votre projet ne nécessite pas déjà de pandas, il serait insensé d'en faire une exigence rien que pour cette fonctionnalité.
la source
J'ai comparé toutes les solutions suggérées (et quelques nouvelles) avec perfplot (un petit projet à moi).
Compter un article
Pour les tableaux suffisamment grands, il s'avère que
est légèrement plus rapide que les autres solutions.
Compter tous les articles
Comme établi précédemment ,
c'est ce que tu veux.
Code pour reproduire les parcelles:
2.
la source
Si vous voulez compter toutes les valeurs à la fois, vous pouvez le faire très rapidement en utilisant des tableaux numpy et
bincount
comme suitqui donne
la source
Si vous pouvez utiliser
pandas
, alorsvalue_counts
il est là pour le sauvetage.Il trie également automatiquement le résultat en fonction de la fréquence.
Si vous voulez que le résultat soit dans une liste de liste, procédez comme ci-dessous
la source
Pourquoi ne pas utiliser Pandas?
Production:
Si vous recherchez un décompte d'un élément particulier, dites a , essayez:
Production:
la source
J'ai eu ce problème aujourd'hui et j'ai lancé ma propre solution avant de penser à vérifier SO. Cette:
est vraiment très lent pour les grandes listes. Ma solution
est en fait un peu plus rapide que la solution Counter, du moins pour Python 2.7.
la source
la source
Voici les trois solutions:
Le plus rapide utilise une boucle for et le stocke dans un Dict.
Résultat
la source
Nombre de tous les éléments avec
itertools.groupby()
Une autre possibilité d'obtenir le décompte de tous les éléments de la liste pourrait se faire au moyen de
itertools.groupby()
.Avec des comptages "en double"
Retour
Remarquez comment il a combiné les trois premiers en
a
tant que premier groupe, tandis que d'autres groupesa
sont présents plus bas dans la liste. Cela se produit car la liste d'entréeL
n'a pas été triée. Cela peut parfois être un avantage si les groupes doivent en fait être séparés.Avec des dénombrements uniques
Si un nombre de groupes unique est souhaité, il suffit de trier la liste d'entrée:
Retour
Remarque: Pour créer des décomptes uniques, de nombreuses autres réponses fournissent un code plus facile et plus lisible par rapport à la
groupby
solution. Mais il est montré ici pour faire un parallèle avec l'exemple de comptage en double.la source
Il a été suggéré d'utiliser le nombre de bits de numpy , mais cela ne fonctionne que pour les tableaux 1d avec des entiers non négatifs . En outre, le tableau résultant peut prêter à confusion (il contient les occurrences des entiers de min à max de la liste d'origine et définit à 0 les entiers manquants).
Une meilleure façon de le faire avec numpy est d'utiliser la fonction unique avec l'attribut
return_counts
défini sur True. Il renvoie un tuple avec un tableau des valeurs uniques et un tableau des occurrences de chaque valeur unique.puis nous pouvons les associer
Il fonctionne également avec d'autres types de données et "listes 2D", par exemple
la source
Pour compter le nombre d'éléments divers ayant un type commun:
donne
3
, pas 6la source
Bien que ce soit une question très ancienne, mais comme je n'ai pas trouvé de doublure, j'en ai fait une.
la source
Vous pouvez également utiliser la
countOf
méthode d'un module intégréoperator
.la source
countOf
est mis en œuvre? Comment se compare-t-il au plus évidentlist.count
(qui bénéficie de la mise en œuvre du C)? Y a-t-il des avantages?Peut ne pas être le plus efficace, nécessite un laissez-passer supplémentaire pour supprimer les doublons.
Implémentation fonctionnelle:
Retour :
ou retournez comme
dict
:Retour :
la source
Cela renverra le nombre d'occurrences de votre_valeur
la source
J'utiliserais
filter()
, prenons l'exemple de Lukasz:la source
si vous voulez un certain nombre d'occurrences pour l'élément particulier:
la source
la source
ce sera le nombre récursif ou la recherche de l'élément dans la liste même s'il est dans la liste des listes
la source