Je suis un débutant en python, alors peut-être que ma question est très noble . Supposons que j'ai une liste de mots et que je souhaite trouver le nombre de fois où chaque mot apparaît dans cette liste . 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 je trouve ce code pas très bon, car de cette façon, le programme parcourt la liste de mots deux fois, une fois pour construire l’ensemble, et une seconde fois en comptant le nombre d’apparences . Bien sûr, je pourrais écrire une fonction pour parcourir la liste et compter, mais ce ne serait pas si pythonique. Alors, y a-t-il une méthode plus efficace et pythonique?
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 se passe dans O (n).
Si vous utilisez python 2.7 +/3.1 +, il existe un Counter Class dans le module collections qui est spécialement conçu 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. N'oubliez donc pas qu'une méthode standard permettant d'effectuer ce type de travail sera bientôt disponible.
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
freqs = {}
for Word in words:
freqs[Word] = freqs.get(Word, 0) + 1 # fetch and increment OR initialize
Je pense que cela revient au même que la solution de Triptych, mais sans importer des collections. Aussi un peu comme la solution de Selinap, mais plus lisible à mon humble avis. Presque identique à la solution de Thomas Weigel, mais sans utiliser Exceptions.
Cela pourrait toutefois être plus lent que d'utiliser defaultdict () depuis la bibliothèque de collections. Puisque la valeur est extraite, incrémentée puis à nouveau attribuée. Au lieu de simplement incrémenté. Cependant, utiliser + = pourrait faire la même chose en interne.
Si vous ne voulez pas utiliser la méthode du dictionnaire standard (parcourir la liste en incrémentant la clé appropriée.), 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 dans le temps O (n log n).
Sans defaultdict:
words = "Apple banana Apple strawberry banana lemon"
my_count = {}
for Word in words.split():
try: my_count[Word] += 1
except KeyError: my_count[Word] = 1
Ne pouvez-vous pas simplement compter?
words = 'the quick brown fox jumps over the lazy gray dog'
words.count('z')
#output: 1
La réponse ci-dessous prend quelques cycles supplémentaires, mais c'est une autre méthode
def func(tup):
return tup[-1]
def print_words(filename):
f = open("small.txt",'r')
whole_content = (f.read()).lower()
print whole_content
list_content = whole_content.split()
dict = {}
for one_Word in list_content:
dict[one_Word] = 0
for one_Word in list_content:
dict[one_Word] += 1
print dict.items()
print sorted(dict.items(),key=func)
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!
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}
Utilisez reduction () pour convertir la liste en un seul dict.
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}