Python - trouver l'élément avec un maximum d'occurrences dans une liste
En Python, j'ai une liste:
L = [1, 2, 45, 55, 5, 4, 4, 4, 4, 4, 4, 5456, 56, 6, 7, 67]
Je tiens à identifier l'élément qui s'est produite le plus grand nombre de fois. Je suis en mesure de résoudre le problème, mais j'ai besoin de la manière la plus rapide de le faire. Je sais que c'est une belle Pythonic réponse à cette question.
- Vous dites que vous êtes en mesure de le résoudre. Il serait d'enseignement pour d'autres si vous pouvez fournir votre propre solution en tant que point de départ.
InformationsquelleAutor zubinmehta | 2011-08-08
Vous devez vous connecter pour publier un commentaire.
Ici est un
defaultdict
solution qui fonctionne avec les versions de Python 2.5 et supérieur:Remarque si
L = [1, 2, 45, 55, 5, 4, 4, 4, 4, 4, 4, 5456, 7, 7, 7, 7, 7, 56, 6, 7, 67]
ensuite, il y a six 4s et six 7s. Toutefois, le résultat sera
(4, 6)
c'est à dire six 4s.itemgetter(1)
peut-être mieux quelambda x: x[1]
construire en termes de simplicité et de rapidité. e. voir docs.python.org/howto/sorting.html#operator-module-functionsPour les anciennes versions de Python (< 2.7), vous pouvez utiliser cette recette pour obtenir le
Compteur
classe.Je suis surpris que personne n'a mentionné la solution la plus simple,
max()
avec la clélist.count
:Exemple:
Cela fonctionne en Python 3 ou 2, mais notez qu'il ne retourne la plus fréquente de l'élément et non pas la fréquence. Aussi, dans le cas d'un tirage (c'est à dire articulaires les plus fréquentes de l'élément) un seul élément est retourné.
Bien que le temps de la complexité de l'utilisation de
max()
est pire que d'utiliserCounter.most_common(1)
comme PM 2Ring commentaires, l'approche bénéficie d'un rapideC
la mise en œuvre et je trouve cette approche est plus rapide pour de courtes listes, mais plus lente pour les plus grands (Python 3.6 timings indiqués dans IPython 5.3):key=
.count
a pour numériser l'ensemble de la liste pour chaque élément, rendant O(n2).Counter
est commode, mais il n'est pas connu pour la vitesse. Et quandn
est relativement petit O(n2) peut être assez bon quand vous êtes à l'aide d'une fonction / méthode qui fonctionne à C de vitesse. Mais quandn
est assez grand, les choses peuvent devenir laid, comme je l'ai discuter ici.Dans votre question, vous avez demandé de la manière la plus rapide de le faire. Comme cela a été démontré à maintes reprises, en particulier avec Python, l'intuition n'est pas un guide fiable: vous avez besoin de mesurer.
Voici un test simple de plusieurs implémentations différentes:
Les résultats sur ma machine:
Il semble donc que la
Counter
solution n'est pas la plus rapide. Et, dans ce cas au moins,groupby
est plus rapide.defaultdict
est bon, mais vous payer un peu pour sa commodité; il est légèrement plus rapide à utiliser régulièrementdict
avec unget
.Ce qui se passe si la liste est beaucoup plus grand? L'ajout de
L *= 10000
pour le test ci-dessus et en réduisant le nombre de répétitions à 200:Maintenant
defaultdict
est le gagnant clair. Alors peut-être que le coût de la 'get' de la méthode et de la perte de la place ajouter ajoute (examen du code généré est laissée en exercice).Mais avec la modification des données de test, le nombre de valeurs n'ont pas changé donc vraisemblablement
dict
etdefaultdict
ont un avantage sur les autres implémentations. Donc ce qui arrive si nous utilisons la plus grande liste, mais d'accroître considérablement le nombre d'éléments uniques? Le remplacement de l'initialisation de L avec:Alors maintenant
Counter
est clairement plus rapide que lagroupby
des solutions, mais encore plus lent que leiteritems
versions dedict
etdefaultdict
.Le point de ces exemples n'est pas de produire une solution optimale. Le point est qu'il n'est pas souvent un optimale de la solution générale. Plus il y a d'autres critères de performance. Les besoins en mémoire diffèrent considérablement entre les solutions et, comme la taille de l'entrée de monte, les besoins en mémoire peut devenir le facteur prépondérant dans la sélection d'un algorithme.
Bas de ligne: tout dépend de la situation et vous avez besoin de mesurer.
Peut-être le most_common() méthode
J'ai obtenu les meilleurs résultats avec
groupby
deitertools
module de cette fonction à l'aide de Python 3.5.2:De sortie:
Test avec
timeit
detimeit
module.J'ai utilisé ce script pour mon test avec
number= 20000
:De sortie (Le meilleur):
Une façon simple, sans bibliothèques ou des ensembles
Je veux jeter dans une autre solution qui a l'air sympa et rapide pour les court listes.
Vous pouvez mesurer cela avec le code fourni par Ned Deily qui va vous donner ces résultats pour les plus petits des cas de test:
Mais attention, il est inefficace et obtient ainsi vraiment lent pour les grandes listes!
Suivante est la solution que j'ai trouvé avec s'il y a plusieurs caractères dans la chaîne tout en ayant la fréquence la plus élevée.
D'entrée: "bonjour les gens"
De sortie:
la plus haute fréquence d'occurence: 3
les personnages sont:
Simple et le meilleur code:
De sortie: 4 apparaît 6 fois
Mon (tout simplement) code (de trois mois à étudier Python):
La sortie sera:
peut quelque chose comme ceci:
testList = [1, 2, 3, 4, 2, 2, 1, 4, 4]
print(max(set(testList), key = testList.count))