veces una tiene saber repite repetidos que para palabras palabra lista letras funcion frecuencia frase elementos elemento cuantas contar como archivo python python-3.x list frequency words

una - funcion python para contar letras



Contar la frecuencia de palabras en una lista y ordenar por frecuencia (10)

Estoy usando Python 3.3

Necesito crear dos listas, una para las palabras únicas y otra para las frecuencias de la palabra.

Debo ordenar la lista de palabras única basada en la lista de frecuencias para que la palabra con la frecuencia más alta sea la primera en la lista.

Tengo el diseño en texto pero no estoy seguro de cómo implementarlo en Python.

Los métodos que he encontrado hasta ahora usan Counter o diccionarios que no hemos aprendido. Ya he creado la lista del archivo que contiene todas las palabras, pero no sé cómo encontrar la frecuencia de cada palabra en la lista. Sé que necesitaré un ciclo para hacer esto pero no puedo resolverlo.

Aquí está el diseño básico:

original list = ["the", "car",....] newlst = [] frequency = [] for word in the original list if word not in newlst newlst.append(word) set frequency = 1 else increase the frequency sort newlst based on frequency list


La forma ideal es usar un diccionario que asigne una palabra a su recuento. Pero si no puede usar eso, puede usar 2 listas: 1 almacenando las palabras y la otra almacenando conteos de palabras. Tenga en cuenta que el orden de las palabras y los recuentos importa aquí. Implementar esto sería difícil y poco eficiente.


Otra solución con otro algoritmo sin usar colecciones:

def countWords(A): dic={} for x in A: if not x in dic: #Python 2.7: if not dic.has_key(x): dic[x] = A.count(x) return dic dic = countWords([''apple'',''egg'',''apple'',''banana'',''egg'',''apple'']) sorted_items=sorted(dic.items()) # if you want it sorted


Prueba esto:

words = [] freqs = [] for line in sorted(original list): #takes all the lines in a text and sorts them line = line.rstrip() #strips them of their spaces if line not in words: #checks to see if line is in words words.append(line) #if not it adds it to the end words freqs.append(1) #and adds 1 to the end of freqs else: index = words.index(line) #if it is it will find where in words freqs[index] += 1 #and use the to change add 1 to the matching index in freqs


Puedes usar

from collections import Counter

Es compatible con Python 2.7, lea más información here

1.

>>>c = Counter(''abracadabra'') >>>c.most_common(3) [(''a'', 5), (''r'', 2), (''b'', 2)]

usar dict

>>>d={1:''one'', 2:''one'', 3:''two''} >>>c = Counter(d.values()) [(''one'', 2), (''two'', 1)]

Pero, primero debes leer el archivo y convertirlo a dict.

2. es el ejemplo de Python Docs, usa re y Counter

# Find the ten most common words in Hamlet >>> import re >>> words = re.findall(r''/w+'', open(''hamlet.txt'').read().lower()) >>> Counter(words).most_common(10) [(''the'', 1143), (''and'', 966), (''to'', 762), (''of'', 669), (''i'', 631), (''you'', 554), (''a'', 546), (''my'', 514), (''hamlet'', 471), (''in'', 451)]


Puedes usar reduce () - Una forma funcional.

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}


Una forma sería hacer una lista de listas, con cada sub-lista en la nueva lista que contenga una palabra y un conteo:

list1 = [] #this is your original list of words list2 = [] #this is a new list for word in list1: if word in list2: list2.index(word)[1] += 1 else: list2.append([word,0])

O, de manera más eficiente:

for word in list1: try: list2.index(word)[1] += 1 except: list2.append([word,0])

Esto sería menos eficiente que usar un diccionario, pero usa conceptos más básicos.


Usar Counter sería la mejor manera, pero si no quieres hacerlo, puedes implementarlo tú mismo de esta manera.

# The list you already have word_list = [''words'', ..., ''other'', ''words''] # Get a set of unique words from the list word_set = set(word_list) # create your frequency dictionary freq = {} # iterate through them, once per unique word. for word in word_set: freq[word] = word_list.count(word) / float(len(word_list))

Freq terminará con la frecuencia de cada palabra en la lista que ya tiene.

Necesitas float allí para convertir uno de los enteros en un flotador, por lo que el valor resultante será un flotante.

Editar:

Si no puede usar un dict o set, aquí hay otra manera menos eficiente:

# The list you already have word_list = [''words'', ..., ''other'', ''words''] unique_words = [] for word in word_list: if word not in unique_words: unique_words += [word] word_frequencies = [] for word in unique_words: word_frequencies += [float(word_list.count(word)) / len(word_list)] for i in range(len(unique_words)): print(unique_words[i] + ": " + word_frequencies[i])

Las indicies de unique_words y word_frequencies coincidirán.


lo mejor que puedes hacer es:

def wordListToFreqDict(wordlist): wordfreq = [wordlist.count(p) for p in wordlist] return dict(zip(wordlist, wordfreq))

luego intente: wordListToFreqDict(originallist)


utilizar esta

from collections import Counter list1=[''apple'',''egg'',''apple'',''banana'',''egg'',''apple''] counts = Counter(list1) print(counts) # Counter({''apple'': 3, ''egg'': 2, ''banana'': 1})


words = file("test.txt", "r").read().split() #read the words into a list. uniqWords = sorted(set(words)) #remove duplicate words and sort for word in uniqWords: print words.count(word), word