web-dev-qa-db-fra.com

nombre d'éléments en python

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?

51
Daniyar

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).

93
Triptych

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.

122
sykora

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
12
nosklo
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.

8
hopla

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).

7
Nick Presta

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
3
Thomas Weigel

Ne pouvez-vous pas simplement compter?

words = 'the quick brown fox jumps over the lazy gray dog'
words.count('z')
#output: 1
0
Antonio

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)
0
Prabhu S
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!

0
Varun Shaandhesh

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}
0
javaidiot

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}
0
Gadi