Élément de la fréquence de comptage en Python
Supposons que j'ai une liste de mots, et je veux savoir le nombre de fois que chaque mot apparaît dans la liste.
D'une manière évidente de le faire est:
words = "apple banana apple strawberry banana lemon"
uniques = set(words.split())
freqs = [(item, words.split().count(item)) for item in uniques]
print(freqs)
Mais j'ai trouver ce code n'est pas très bonne, parce que le programme s'exécute par le biais de la liste de mots à deux reprises, une fois pour construire le jeu, et une deuxième fois pour compter le nombre d'apparitions.
Bien sûr, je pourrais écrire une fonction à exécuter par le biais de la liste et de faire le compte, mais qui ne serait pas si Pythonic. Alors, est-il plus efficace et Pythonic façon?
- Pas deux fois, il ressemble à O(N*N) la complexité
- Vous pouvez être intéressé par: stackoverflow.com/a/20308657/2534876 pour des questions de performance.
Vous devez vous connecter pour publier un commentaire.
defaultdict à la rescousse!
Cela s'exécute en O(n).
Counter
à la place.La
Compteur
de la classe dans lecollections
module est conçu pour résoudre ce type de problème:'apple' : .3333 (2/6),
freq_percentage = {k: v/total for k, v in your_counter_object.items()}
Approche Standard:
Groupby oneliner:
Je pense que cela entraîne de la même façon qu'Triptyque de la solution, mais sans l'importation de collections. Aussi un peu comme Selinap de la solution, mais plus lisible à mon humble avis. Presque identique à Thomas Weigel la solution, mais sans l'aide d'Exceptions.
Cela pourrait être plus lent que d'utiliser defaultdict() à partir des collections de la bibliothèque toutefois. Puisque la valeur est extraite, incrémenté puis de nouveau attribué. Au lieu de simplement incrémenté. Toutefois, l'utilisation d' += pourraient faire de même en interne.
Si vous ne souhaitez pas utiliser le dictionnaire standard de la méthode (en boucle par le biais de la liste de l'incrémentation de la bonne dict. la clé), vous pouvez essayer ceci:
Il s'exécute en O(n log n) en temps.
Sans defaultdict:
Tu ne peux pas utiliser le comte?
Il m'est arrivé de travailler sur quelque Étincelle de l'exercice, voici ma solution.
**#sortie de la ci-dessus **
Utiliser de réduire() pour convertir la liste à un seul dict.
retourne
Espérons que cette aide!
La réponse ci-dessous prend supplémentaire de cycles, mais il est une autre méthode