Contar la frecuencia de las palabras en una lista y ordenar por frecuencia

Estoy usando Python 3.3

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

Tengo que ordenar la lista de palabras únicas en función de 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 utilizan 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 bucle 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 

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

Puedes usar

 from collections import Counter 

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

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 los documentos de Python, use 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)] 
 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 

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 contiene 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, más eficientemente:

 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.

Otra solución más 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 

Usar Counter sería la mejor manera, pero si no quiere hacerlo, puede implementarlo 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.

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

Editar:

Si no puedes usar un dict o set, aquí hay otra forma 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 indicaciones de unique_words y word_frequencies coincidirán.

La forma ideal es usar un diccionario que asigne una palabra a su cuenta. Pero si no puede usar eso, es posible que desee usar 2 listas: 1 que almacena las palabras y la otra que almacena la cantidad de palabras. Tenga en cuenta que el orden de las palabras y las cuentas importa aquí. Implementar esto sería difícil y no muy eficiente.

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 

Aquí está el código que respalda su pregunta is_char () verifique si la cadena de validación cuenta esas cadenas solo, Hashmap es un diccionario en Python

 def is_word(word): cnt =0 for c in word: if 'a' <= c <='z' or 'A' <= c <= 'Z' or '0' <= c <= '9' or c == '$': cnt +=1 if cnt==len(word): return True return False def words_freq(s): d={} for i in s.split(): if is_word(i): if i in d: d[i] +=1 else: d[i] = 1 return d print(words_freq('the the sky$ is blue not green')) 

Las pandas responden:

 import pandas as pd original_list = ["the", "car", "is", "red", "red", "red", "yes", "it", "is", "is", "is"] pd.Series(original_list).value_counts() 

Si lo quisieras en orden ascendente, es tan simple como:

 pd.Series(original_list).value_counts().sort_values(ascending=True) 

Lo mejor que puedes hacer es:

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

a continuación, intente: wordListToFreqDict(originallist)