Estoy tratando de imprimir las 10 palabras más frecuentes usando el siguiente código. Sin embargo, no está funcionando. ¿Alguna idea de cómo solucionarlo?
def reducer_count_words(self, word, counts): # send all (num_occurrences, word) pairs to the same reducer. # num_occurrences is so we can easily use Python's max() function. yield None, (sum(counts), word) # discard the key; it is just None def reducer_find_max_10_words(self, _, word_count_pairs): # each item of word_count_pairs is (count, word), # so yielding one results in key=counts, value=word tmp = sorted(word_count_pairs)[0:10] yield tmp
tmp = sorted(word_count_pairs, key=lambda pair: pair[0], reverse=True)[0:10]
Explicación:
key
de sorted()
permite ejecutar una función en cada elemento antes de la comparación. lambda pair: pair[0]
es una función que extrae el número de tus word_count_pairs. reverse
clasifica en orden descendente, en lugar de orden ascendente. Fuentes:
aparte : si tiene muchas palabras diferentes, ordenar la lista completa para encontrar los diez primeros es ineficiente. Hay algoritmos mucho más eficientes. El método most_common()
mencionado en otras respuestas probablemente utiliza un algoritmo más eficiente.
Usa collections.Counter
y su método most_common
:
>>>from collections import Counter >>>my_words = 'aa foo bar foo' >>>Counter(my_words.split()).most_common() [('foo', 2), ('a', 2), ('b', 1)]
Usar collections.most_common ()
Ejemplo:
most_common([n]) Return a list of the n most common elements and their counts from the most common to the least. If n is not specified, most_common() returns all elements in the counter. Elements with equal counts are ordered arbitrarily: >>> from collections import Counter >>> Counter('abracadabra').most_common(3) [('a', 5), ('r', 2), ('b', 2)]