2011-03-08 15 views
7

tengo una lista de palabras:Encontrar las palabras más populares en una lista

words = ['all', 'awesome', 'all', 'yeah', 'bye', 'all', 'yeah'] 

Y quiero obtener una lista de tuplas:

[(3, 'all'), (2, 'yeah'), (1, 'bye'), (1, 'awesome')] 

donde cada tupla es ...

(number_of_occurrences, word) 

La lista debe ordenarse por el número de veces.

Lo que he hecho hasta ahora:

def popularWords(words): 
    dic = {} 
    for word in words: 
     dic.setdefault(word, 0) 
     dic[word] += 1 
    wordsList = [(dic.get(w), w) for w in dic] 
    wordsList.sort(reverse = True) 
    return wordsList 

La pregunta es ...

Es Pythonic, elegante y eficiente? ¿Puedes hacerlo mejor? Gracias de antemano.

Respuesta

9

Usted puede utilizar el counter para esto.

import collections 
words = ['all', 'awesome', 'all', 'yeah', 'bye', 'all', 'yeah'] 
counter = collections.Counter(words) 
print(counter.most_common()) 
>>> [('all', 3), ('yeah', 2), ('bye', 1), ('awesome', 1)] 

Da la tupla con columnas invertidas.

De los comentarios: collections.counter is> = 2.7.3.1. Puede usar the counter recipe para versiones inferiores.

+1

Solo en Python 2.7+ o 3.1+. Ninguno de los dos se usa mucho, así que vale la pena mencionarlo. – Triptych

+0

Puede usar [esta receta] (http: //code.activestate.com/recipes/576611-counter-class /) si aún usa una versión anterior de python. Creo que da la misma interfaz. – SiggyF

+0

Mis tuplas han invertido columnas simplemente porque era más sencillo para mí ordenarlas. :) Me gusta que respondas, ya que es muy elegante y no me importa usar Python 2.7. –

2

¿Es pitónico, elegante y eficiente?

ve bien para mí ...

¿Es capaz de hacerlo mejor?

"better"? Si es comprensible y eficiente, ¿no es suficiente?

Quizás mire defaultdict para usar eso en lugar de setdefault.

+0

Soy un estudiante de Python, aprendiendo todos los días. Cualquier consejo, buen consejo es bienvenido. –

+0

"Soy un estudiante de Python, aprendiendo todos los días". Yo también. :-) –

+0

BTW: defaultdict hizo mi día! –

5

La colección defaultdict es lo que busca:

from collections import defaultdict 

D = defaultdict(int) 
for word in words: 
    D[word] += 1 

Eso le da un diccionario donde las claves son las palabras y los valores son frecuencias. Para llegar a sus tuplas (frecuencia, de palabras):

tuples = [(freq, word) for word,freq in D.iteritems()] 

Si usando Python 2.7 +/3.1 +, que puede hacer el primer paso con una orden interna de clase Counter:

from collections import Counter 
D = Counter(words) 
+0

me ganó por 4 segundos, y mejor dicho. +1. :-) –

+0

Jaja, tengo que mantener su mano sobre el zumbador @ Jason – Triptych

+0

defaultdict es lo mejor que he aprendido esta semana. ¡Gracias! –

Cuestiones relacionadas