2012-09-09 20 views
5

En python, ¿cómo puedo recorrer un archivo de texto y contar el número de apariciones de cada letra? Me doy cuenta de que solo podría usar una declaración 'para x en el archivo' para ir a través de ella y luego configurar 26 declaraciones más o menos si elif, pero seguramente hay una mejor manera de hacerlo.Frecuencia de recuento de letras en un archivo de texto

Gracias.

+0

http://stackoverflow.com/search ? q = [python] + count –

+1

[Aquí] (http://stackoverflow.com/a/5148987/866571) es una pregunta similar. – Mayura

+0

posible duplicado de [Frecuencia de letra en python] (http://stackoverflow.com/questions/5148903/letter-frequency-in-python) –

Respuesta

14

Uso collections.Counter():

from collections import Counter 
with open(file) as f: 
    c = Counter() 
    for x in f: 
     c += Counter(x.strip()) 

Como @mgilson señaló, en el caso si el archivo no es tan grande, sólo tiene que hacer:

c = Counter(f.read().strip()) 

ejemplo:

>>> c = Counter() 
>>> c += Counter('aaabbbcccddd eee fff ggg') 
>>> c 
Counter({'a': 3, ' ': 3, 'c': 3, 'b': 3, 'e': 3, 'd': 3, 'g': 3, 'f': 3}) 
>>> c += Counter('aaabbbccc') 
Counter({'a': 6, 'c': 6, 'b': 6, ' ': 3, 'e': 3, 'd': 3, 'g': 3, 'f': 3}) 

o utiliza el método de cadenas count():

from string import ascii_lowercase  # ascii_lowercase =='abcdefghijklmnopqrstuvwxyz' 
with open(file) as f: 
    text = f.read().strip() 
    dic = {} 
    for x in ascii_lowercase: 
     dic[x] = text.count(x) 
+0

para el caso: 'Counter (f.read())' debería hacer el truco si OP puede permitirse leer el archivo completo en la memoria. – mgilson

+0

funciona maravillosamente. Gracias ! Sin embargo, el método Counter (f.read()) arroja algunos errores sobre la mezcla de datos. Es probable que mis archivos tengan alrededor de 1000 caracteres de longitud, por lo que el tamaño no debería ser un problema. – Muzz5

4

utilizar un diccionario - básicamente letters[char]++

0

Counter es una buena manera de hacer esto, pero Contador sólo está disponible en 3.1 y superiores, además de 2,7.

Si está en 3.0 o 2. [56], probablemente debería usar collections.defaultdict (int) en su lugar.

0

De esta forma se crea un histograma de diccionario para cada caracter, que se puede usar para crear un gráfico de barras o similar. Si desea limitarlo a letras o algún subconjunto, deberá agregar un adicional condicional, o filtrar freqs al final.

freqs = {} 
for line in file_list: 
    for char in line: 
     if char in freqs: 
      freqs[char] += 1 
     else: 
      freqs[char] = 1 

print freqs 

Supongo que ha abierto el archivo y ha rellenado * file_list * con los contenidos.

+0

'has_key()' ha sido desaprobado, use 'in'. –

+0

@ james-bradbury Debería ser 'si char en freqs.keys()' en lugar de 'if char in freqs'. – MaxMarchuk

+0

@MaxMarchuk. Estás en lo correcto si hablamos de Python 2.x, pero en Python 3 puedes usar la forma más simple y más legible para iterar sobre las teclas. –

1

básicamente, sin importaciones: is_letter es una función para decidir si algo es una carta, para que pueda contar con otras cosas que las letras inglesas usuales

def add_or_init(dictionary, c): 
     if(c in dictionary): 
       dictionary[c]+=1 
     else: 
       dictionary[c]=1 
def count_one_letter(dictionary, c, is_letter): 
     if is_letter(c): 
       add_or_init(dictionary, c) 
def count_letters(dictionary, string, is_letter): 
     for c in string: 
       count_one_letter(dictionary, c, is_letter) 
     return dictionary 

#count all characters 
count_letters(dict(),'aaabbbcccddd eee fff ggg',lambda x: True) 
# => {'a': 3, ' ': 3, 'c': 3, 'b': 3, 'e': 3, 'd': 3, 'g': 3, 'f': 3} 
Cuestiones relacionadas