Cómo contar caracteres en un archivo e imprimirlos ordenados alfanuméricamente

(Si tienes un título mejor, edítalo, ¡no podría explicarlo correctamente! 🙂 Así que este es mi código:

with open('cipher.txt') as f: f = f.read().replace(' ', '') new = [] let = [] for i in f: let.append(i) if i.count(i) > 1: i.count(i) == 1 else: new = sorted([i + ' ' + str(f.count(i)) for i in f]) for o in new: print(o) 

Y esto es cipher.txt :

 xli uymgo fvsar jsb 

Se supone que debo imprimir las letras usadas y cuántas veces se usan, mi código funciona, pero lo necesito por orden alfabético. Intenté ponerlas en una list(a) y luego ordenarlas, pero no lo hice. Consíguelo, ¿alguna idea? ¡Gracias por adelantado!

Siempre que trate con el conteo, puede usar collections.Counter Encuentre aquí:

 >>> from collections import Counter >>> print sorted(Counter('xli uymgo fvsar jsb'.replace(' ', '')).most_common()) [('a', 1), ('b', 1), ('f', 1), ('g', 1), ('i', 1), ('j', 1), ('l', 1), ('m', 1), ('o', 1), ('r', 1), ('s', 2), ('u', 1), ('v', 1), ('x', 1), ('y', 1)] 

Si no puede importar ningún módulo, puede adjuntar a a una lista y luego ordenarlo:

 new = [] for i in f: new.append(i + ' ' + str(f.count(i)) # Note that i is a string, so str() is unnecessary 

O bien, utilizando una lista de comprensión:

 new = [i + ' ' + str(f.count(i)) for i in f] 

Finalmente, para ordenarlo, simplemente ponga sorted() alrededor de él. No se necesitan parámetros adicionales porque su resultado es alfabético :).

Aquí hay un oneliner sin importaciones:

{s[i]: n for i, n in enumerate(map(s.count, s))}

Y en orden alfabético (si lo anterior es d ):

for k in sorted(d): print k, d[k]

O otra versión (oneliner alfabético):

sorted(set([(s[i], n) for i, n in enumerate(map(s.count, s))]))