2012-01-28 8 views
9

En otros idiomas, me gustaría utilizar una construcción como esta:¿Cuál es la forma pitónica de generar una gama de caracteres?

a..z 

no pude llegar a una solución mejor que esto:

[chr(x) for x in range(ord("a"), ord("z") + 1)] 

¿Hay un camino más corto, más fácil de leer construyendo tal lista?

+0

En un esfuerzo por disuadir a la gente de responder con él, voy para mencionar ['string.lowercase'] (http: //docs.python.o rg/library/string.html # string.lowercase) en un comentario, pero solo funciona si quiere el alfabeto completo (** Edit **: ... suspiro) –

+1

Sí, se puede usar _string.lowercase_, también una solución legible, pero solo funciona si quieres el alfabeto completo. Realmente me gustaría poder hacer algo como _range ("a", "c") _ – Jeremy

+2

Creo que esta solución es realmente buena. Pero como es ahora, simplemente va de 'a' a 'y',' ord ('z') + 1' debería resolver el problema – juliomalegria

Respuesta

6

No necesariamente grande si usted quiere hacer algo distinto de A a Z, pero se puede hacer esto:

from string import ascii_lowercase 
for c in ascii_lowercase: 
    print c 
+1

Bastante bueno para otros rangos que 'a..z', porque puedes tomar fácilmente una porción de' ascii_lowercase'. –

+2

@larsmans Fácilmente ... ¿cómo? Aparte de convertir manualmente los caracteres finales a desplazamientos en su cabeza, lo que hace que el punto –

0

Puede sustituir la lista por comprensión con una llamada map(chr,range(ord('a'),ord('z')+1)), pero eso no es quizá lo que' Realmente estoy preguntando. El ejemplo que muestra, sin embargo, se importa más apropiadamente; está disponible como una cadena en string.lowercase.

letras Suponiendo que coinciden con los ordinales puede ser un error, teniendo en cuenta las letras como SS y AE, que pueden ser ordenados de manera diferente dependiendo de locales (es decir AAO están últimos en el alfabeto para el sueco, pero a y o son variantes de una y o en alemán). Es por eso que tenemos funciones como unicode.islower() y locale.strcoll().

1

Mi forma es similar a la suya, pero se puede utilizar map y crear una función arbitraria como esto

>>> def generate_list(char1,char2): 
...  myl = map(chr, range(ord(char1),ord(char2)+1)) 
...  print myl 
... 
>>> generate_list("a","d") 
['a', 'b', 'c', 'd'] 
1

No hay nada malo en su lista de comprensión, pero tal vez usted quiere probar:

from string import lowercase 
print lowercase 
    abcdefghijklmnopqrstuvwxyz 
print list(lowercase) 
    ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 

Según lo observado por julio.alegria y Nathan Binkert lowercase es una cadena de letras minúsculas y las cadenas de Python son iterables.

Si necesita subconjuntos del alfabeto, hay maneras agradables y Pythonic de hacer esto:

print lowercase.find('f') 
    5 
print lowercase[5,9] 
    fghij 
print filter(lambda c: ord('f') <= ord(c) <= ord('j'), lowercase) 
    fghij 
0

Como se ha señalado en otros lugares, las letras 'a' a la 'z' ya están en string.lowercase. Por lo tanto, puedes tomar una porción de eso.

import string 
def create_letter_list(start_char, end_char): 
    return string.lowercase[ord(start_char) - ord('a'): ord(end_char) - ord('a') + 1] 

letter_list = create_letter_list('g', 'n') 
print letter_list 

Salida:

GHIJKLMN

1

Otra opción:

from string import ascii_lowercase 

def charRange(start, end): 
    offset = ord('a') 
    return ascii_lowercase[ord(start)-offset:ord(end)-offset+1] 

charRange('a', 'f') 
> 'abcdef' 
0
import random 

def random_chars(size=10, chrs=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(chrs) for x in range(size)) 
+0

no sea seguro. Por qué cree que el resultado deseado es una selección de letras aleatorias. – hughdbrown

Cuestiones relacionadas