python - une - titre page google




nombre de fréquence d'éléments en python (8)

Approche standard:

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"
words = words.split()
result = collections.defaultdict(int)
for word in words:
    result[word] += 1

print result

Groupby oneliner:

from itertools import groupby

words = "apple banana apple strawberry banana lemon"
words = words.split()

result = dict((key, len(list(group))) for key, group in groupby(sorted(words)))
print result

Je suis un novice python, alors peut-être ma question est très noob. Supposons que j'ai une liste de mots, et je veux trouver le nombre de fois que chaque mot apparaît dans cette liste. Manière évidente de faire ceci 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 je trouve que ce code n'est pas très bon, parce que ce programme parcourt deux fois la liste de mots, une fois pour construire l'ensemble, et la deuxième fois en comptant le nombre d'apparences. Bien sûr, je pourrais écrire une fonction pour parcourir la liste et faire le comptage, mais ce ne serait pas si pythonique. Alors, y a-t-il une manière plus efficace et pythonique?


Il m'est arrivé de travailler sur un exercice Spark, voici ma solution.

tokens = ['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']

print {n: float(tokens.count(n))/float(len(tokens)) for n in tokens}

** # sortie de ce qui précède **

{'brown': 0.16666666666666666, 'lazy': 0.16666666666666666, 'jumps': 0.16666666666666666, 'fox': 0.16666666666666666, 'dog': 0.16666666666666666, 'quick': 0.16666666666666666}

Si vous ne souhaitez pas utiliser la méthode de dictionnaire standard (en parcourant la liste en incrémentant la bonne dict), vous pouvez essayer ceci:

>>> from itertools import groupby
>>> myList = words.split() # ['apple', 'banana', 'apple', 'strawberry', 'banana', 'lemon']
>>> [(k, len(list(g))) for k, g in groupby(sorted(myList))]
[('apple', 2), ('banana', 2), ('lemon', 1), ('strawberry', 1)]

Il s'exécute en heure O (n log n).


Si vous utilisez python 2.7 + / 3.1 +, il existe une classe de compteurs dans le module des collections qui est spécialement conçue pour résoudre ce type de problème:

>>> from collections import Counter
>>> words = "apple banana apple strawberry banana lemon"
>>> freqs = Counter(words.split())
>>> print(freqs)
Counter({'apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1})
>>> 

Étant donné que les versions 2.7 et 3.1 sont toujours en version bêta, il est peu probable que vous l'utilisiez, alors gardez à l'esprit qu'une façon standard de faire ce genre de travail sera bientôt disponible.


Utilisez reduce () pour convertir la liste en dict unique.

words = "apple banana apple strawberry banana lemon"
reduce( lambda d, c: d.update([(c, d.get(c,0)+1)]) or d, words.split(), {})

résultats

{'strawberry': 1, 'lemon': 1, 'apple': 2, 'banana': 2}

defaultdict à la rescousse!

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"

d = defaultdict(int)
for word in words.split():
    d[word] += 1

Cela fonctionne dans O (n).


freqs = {}
for word in words:
    freqs[word] = freqs.get(word, 0) + 1 # fetch and increment OR initialize

Je pense que cela aboutit à la même chose que la solution de Triptych, mais sans importer de collections. Aussi un peu comme la solution de Selinap, mais plus lisible. Presque identique à la solution de Thomas Weigel, mais sans utiliser d'exceptions.

Cela pourrait être plus lent que d'utiliser defaultdict () de la bibliothèque de collections cependant. Comme la valeur est récupérée, incrémentée puis à nouveau affectée. Au lieu d'être simplement incrémenté. Cependant, utiliser + = peut faire exactement la même chose en interne.


words = "apple banana apple strawberry banana lemon"
w=words.split()
e=list(set(w))       
for i in e:
   print(w.count(i))    #Prints frequency of every word in the list

J'espère que cela t'aides!





counting