veces una tupla para palabra lista letras funcion frecuencia espacios elementos elemento cuantas contar contador con aparece python count frequency counting

una - recuento de frecuencia de elemento en python



funcion python para contar letras (11)

¿No puedes usar el conteo?

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

Soy un novato de pitón, así que tal vez mi pregunta es muy novato. Supongamos que tengo una lista de palabras, y quiero encontrar el número de veces que aparece cada palabra en esa lista. La forma obvia de hacer esto es:

words = "apple banana apple strawberry banana lemon" uniques = set(words.split()) freqs = [(item, words.split.count(item)) for item in uniques] print(freqs)

Pero creo que este código no es muy bueno, porque de esta manera el programa se ejecuta dos veces en la lista de palabras, una para construir el conjunto y la segunda para contar el número de apariciones. Por supuesto, podría escribir una función para ejecutar la lista y hacer el recuento, pero eso no sería tan pitónico. Entonces, ¿hay una manera más eficiente y pitónica?


Enfoque estándar:

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


Me pasó a trabajar en algunos ejercicios de chispa, aquí está mi solución.

tokens = [''quick'', ''brown'', ''fox'', ''jumps'', ''lazy'', ''dog''] print {n: float(tokens.count(n))/float(len(tokens)) for n in tokens}

** # resultado de lo anterior **

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


Si está utilizando Python 2.7 + / 3.1 +, hay una clase de contador en el módulo de colecciones que está especialmente diseñada para resolver este tipo de problema:

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

Debido a que tanto el 2.7 como el 3.1 aún están en beta, es poco probable que lo esté utilizando, así que tenga en cuenta que una forma estándar de hacer este tipo de trabajo pronto estará disponible.


Si no desea utilizar el método de diccionario estándar (recorriendo la lista aumentando la clave dict. Adecuada), puede intentar esto:

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

Se ejecuta en el tiempo O (n log n).


Sin defecto de pago:

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


Use reduce () para convertir la lista a un solo dict.

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

devoluciones

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


defaultdict al rescate!

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

Esto se ejecuta en O (n).


La respuesta a continuación requiere algunos ciclos adicionales, pero es otro método

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)


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

Creo que esto da como resultado la solución de Triptych, pero sin importar colecciones. También es un poco como la solución de Selinap, pero es más fácil de leer. Casi idéntica a la solución de Thomas Weigel, pero sin usar Excepciones.

Sin embargo, esto podría ser más lento que usar defaultdict () desde la biblioteca de colecciones. Dado que el valor se obtiene, se incrementa y luego se asigna de nuevo. En lugar de simplemente incrementado. Sin embargo, usar + = podría hacer lo mismo internamente.


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

¡Espero que esto ayude!