2011-10-25 13 views
5

Trabajando en una aplicación de recuento de apariciones de palabras en un entorno Python 3.2/Windows.Recuento de palabras Python y rango

¿Alguien puede ayudarme a decirme por qué lo siguiente no está funcionando?

from string import punctuation 
from operator import itemgetter 

N = 100 
words = {} 

words_gen = (word.strip(punctuation).lower() for line in open("poi_run.txt") 
             for word in line.split()) 

for word in words_gen: 
    words[word] = words.get(word, 0) + 1 

top_words = (words.iteritems(), key=itemgetter(1), reverse=True)[:N] 

for word, frequency in top_words: 
    print ("%s %d") % (word, frequency) 

El rastreo hacia atrás de error es:

Message File Name Line Position  
Traceback    
    <module> C:\Users\will\Desktop\word_count.py 13  
AttributeError: 'dict' object has no attribute 'iteritems'    

Gracias

N.B.

código Totalmente de trabajo:

from string import punctuation 
from operator import itemgetter 

N = 100 
words = {} 

words_gen = (word.strip(punctuation).lower() for line in open("poi_run.txt") 
             for word in line.split()) 

for word in words_gen: 
    words[word] = words.get(word, 0) + 1 

top_words = sorted(words.items(), key=itemgetter(1), reverse=True)[:N] 

for word, frequency in top_words: 
    print ("%s %d" % (word, frequency)) 

Gracias de nuevo chicos

+0

'top_words = ((words.iteritems), clave = itemgetter (1), invierta = true) [: N] '- ¿No te está faltando algún nombre de función aquí? – eumiro

+0

Es posible que desee utilizar un 'defaultdict':' words = defaultdict (int); para palabras en word_gen: words [word] + = 1'. –

+0

@TimPietzcker: En realidad, 'Counter' del mismo módulo es mejor aquí. Perfecto, incluso ¿Por qué no lo pensé antes? Gracias por la idea –

Respuesta

4

En Python 3, use solo items donde anteriormente usaba iteritems.

El nuevo items() devuelve un que admite la iteración, así como len y in.

Y, por supuesto, en top_words = (words.iteritems(), ... se olvidó de llamar a la función sorted.


Editar: Por favor, vea mi otra respuesta para una mejor solución.

+0

Wow gracias a Petr, solo para aclarar, ¿cómo llamaría a la función ordenada? ordenado (top_words = (words.items(), key = items (1), reverse = True)) [: N] ? – Fruitful

+0

'top_words = ordenados (words.items(), key = itemgetter (1), reverse = True) [: N]' –

+0

¡Petr no puedo agradecerle lo suficiente!Para gustos se benefician código final es: de puntuacion de importación cadena de importación operador itemgetter N = 100 palabras = {} words_gen = (word.strip (puntuacion) .lower() para la línea de ("poi_run abierto .txt ") por palabra en linea.split()) por palabra en words_gen: palabras [palabra] = words.get (palabra, 0) + 1 top_words = ordenados (words.items(), llave = itemgetter (1), reverse = True) [: N] para palabra, frecuencia en top_words: print ("% s% d"% (palabra, frecuencia)) – Fruitful

2

De Python 3.x implementation documents

"Además, los dict.iterkeys(),() y dict.iteritems dict.itervalues ​​() métodos ya no son compatibles. "

Ver el enlace anterior para obtener realmente la API correcta para 3.x

La forma más sencilla es utilizar un mapa() o el filtro() para obtener iteración llaves.

+0

Gracias por este chicos. Me estoy mudando a Perl !! – Fruitful

4

Considérese la clase Counter del módulo collections - que va a hacer su primera for bucle para usted:

from collections import Counter 

N = 100 
words_gen = ... 

top_words = Counter(words_gen).most_common(N) 

for word, frequency in top_words: 
    print("%s %d" % (word, frequency)) 
+0

Me gusta esto ... ¡¡Te haré saber cómo me llevo !! – Fruitful

Cuestiones relacionadas