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