Comment obtenir des valeurs uniques avec nombre d'événements à partir d'une liste en Python?
J'ai une liste qui a répéter les éléments et je veux une liste des objets uniques avec leur fréquence.
Par exemple, j'ai ['a', 'a', 'b', 'b', 'b']
, et je veux [('a', 2), ('b', 3)]
.
La recherche d'un moyen simple de le faire sans boucle deux fois.
- Juste pour que vous le savez... la réponse que vous avez accepté viole vos "sans boucle double contrainte. (Je suis en commentaire ici afin que vous soyez averti de l' :-).
- Je suis d'accord. Merci, Tom.
- Pouvez-vous préciser votre question, un peu trop? Sont vos articles toujours regroupés? Ou peuvent-ils apparaître dans n'importe quel ordre dans la liste?
- Oui, Tom. Bien que ma question ne le précise pas - mais dans mon cas en particulier, les valeurs sont à venir triés. Merci.
InformationsquelleAutor Samantha Green | 2010-03-06
Vous devez vous connecter pour publier un commentaire.
Si vos articles sont regroupés (c'est à dire les éléments similaires sont réunis dans un groupe), la méthode la plus efficace à utiliser est
itertools.groupby
:groupby
est l'approche efficace et préféréeg
est l'objet résultant puissorted(g, key=lambda x: x[1])
Avec Python 2.7+, vous pouvez utiliser
collections.Compteur
.Sinon, voir ce compteur recette.
Sous Python 2.7+:
De sortie est:
Si vous êtes prêt à utiliser une 3ème partie de la bibliothèque NumPy propose une solution pratique. Ceci est particulièrement efficace si votre liste contient uniquement les données numériques.
De comprendre la syntaxe, note
np.unique
ici renvoie un tuple de valeurs uniques et compte:Voir aussi: Quels sont les avantages de NumPy régulier sur les listes Python?
la "old school".
Je sais que ce n'est pas un one-liner... mais pour moi, je l'aime parce qu'il est clair pour moi que nous passons sur la première liste de valeurs une fois (au lieu de l'appeler compter sur elle):
Avec l'aide de pandas, vous pouvez faire comme:
Une autre façon de le faire serait
puis d'obtenir la liste de tuples,
Cela ne va sur la liste une fois, mais il ne avoir à traverser le dictionnaire une fois. Toutefois, étant donné qu'il y a beaucoup de doublons dans la liste, puis le dictionnaire doit être beaucoup plus petit, donc plus rapide à parcourir.
Néanmoins, pas très joli, ou concis bout de code, je l'admets.
mytups = mydict.items()
est un moyen plus simple pour obtenir la liste de tuples.Une solution sans hachage:
Convertir en une structure de données dans une pandas série s:
CODE:
Voici un moyen: