La mejor manera de convertir la lista de palabras en un dictado de frecuencia

Resuelto ʞɔıu asked hace 15 años • 8 respuestas

¿Cuál es la mejor manera de convertir una lista/tupla en un dictado donde las claves son los valores distintos de la lista y los valores son las frecuencias de esos valores distintos?

En otras palabras:

['a', 'b', 'b', 'a', 'b', 'c']
--> 
{'a': 2, 'b': 3, 'c': 1}

(He tenido que hacer algo como lo anterior muchas veces, ¿hay algo en la biblioteca estándar que lo haga por usted?)

EDITAR:

Jacob Gabrielson señala que hay algo en camino en la biblioteca estándar para la rama 2.7/3.1

ʞɔıu avatar Apr 07 '09 01:04 ʞɔıu
Aceptado

Creo que la forma más fácil de entender (aunque puede que no sea la más eficiente) es hacer:

{i:words.count(i) for i in set(words)}
SilentGhost avatar Apr 06 '2009 19:04 SilentGhost

Un poco

from collections import defaultdict
fq= defaultdict( int )
for w in words:
    fq[w] += 1

Eso normalmente funciona bien.

S.Lott avatar Apr 06 '2009 18:04 S.Lott

Solo tenga en cuenta que, a partir de Python 2.7/3.1, esta funcionalidad estará integrada en el collectionsmódulo; consulte este error para obtener más información. Aquí está el ejemplo de las notas de la versión :

>>> from collections import Counter
>>> c=Counter()
>>> for letter in 'here is a sample of english text':
...   c[letter] += 1
...
>>> c
Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
'p': 1, 'r': 1, 'x': 1})
>>> c['e']
5
>>> c['z']
0
Jacob Gabrielson avatar Apr 07 '2009 20:04 Jacob Gabrielson

En realidad, la respuesta de Counter ya se mencionó, ¡pero podemos hacerlo incluso mejor (más fácil)!

from collections import Counter
my_list = ['a', 'b', 'b', 'a', 'b', 'c']
Counter(my_list)  # returns a Counter, dict-like object
>> Counter({'b': 3, 'a': 2, 'c': 1})
YardenR avatar Jul 02 '2018 12:07 YardenR