¿Es posible hacer un rango de letras en python?

¿Hay una manera de hacer un rango de letras en python como esta:

for x in range(a,h,) 

Algo como:

 for x in [chr(i) for i in range(ord('a'),ord('h')] 

(o tal vez:

 for x in map(chr, range(*map(ord,['a', 'h']))) 

)

Puede usar ord() para convertir las letras en ordinales de caracteres y viceversa:

 def char_range(start, end, step=1): for char in range(ord(start), ord(end), step): yield chr(char) 

Parece funcionar bien

 >>> ''.join(char_range('a', 'z')) 'abcdefghijklmnopqrstuvwxy' 

No hay un rango de letras incorporado, pero puede escribir uno:

 def letter_range(start, stop): for c in xrange(ord(start), ord(stop)): yield chr(c) for x in letter_range('a', 'h'): print x, 

huellas dactilares:

 abcdefg 
 import string def letter_range(f,l,al = string.ascii_lowercase): for x in al[al.index(f):al.index(l)]: yield x print ' '.join(letter_range('a','h')) 

resultado

 abcdefg 

esto es más fácil para mí al menos para leer / entender (y puede personalizar fácilmente qué letras se incluyen y en qué orden):

 letters = 'abcdefghijklmnopqrstuvwxyz' for each in letters: print each result: a b c ... z 

La solución de Emanuele es excelente, siempre y cuando uno solo solicite un rango de caracteres individuales, lo que admitiré es lo que planteó el interrogador original. También hay soluciones para generar todas las combinaciones de múltiples caracteres: cómo generar un rango de cadenas desde aa … hasta zz . Sin embargo, sospecho que alguien que quiera un personaje como la función de rango podría querer poder lidiar con la generación de un rango arbitrario desde “y” a “af” (pasar de “z” a “aa”). Así que aquí hay una solución más general que incluye la capacidad de especificar el último miembro del rango o su longitud.

 def strange(start, end_or_len, sequence='ABCDEFGHIJKLMNOPQRSTUVWXYZ'): """Create a generator of a range of 'sequential' strings from start to end_or_len if end_or_len is a string or containing end_or_len entries if end_or_len is an integer. >>> list(strange('D', 'F')) ['D', 'E', 'F'] >>> list(strange('Y', 'AB')) ['Y', 'Z', 'AA', 'AB'] >>> list(strange('Y', 4)) ['Y', 'Z', 'AA', 'AB'] >>> list(strange('A', 'BAA', sequence='AB')) ['A', 'B', 'AA', 'AB', 'BA', 'BB', 'AAA', 'AAB', 'ABA', 'ABB', 'BAA'] >>> list(strange('A', 11, sequence='AB')) ['A', 'B', 'AA', 'AB', 'BA', 'BB', 'AAA', 'AAB', 'ABA', 'ABB', 'BAA'] """ seq_len = len(sequence) start_int_list = [sequence.find(c) for c in start] if isinstance(end_or_len, int): inclusive = True end_int_list = list(start_int_list) i = len(end_int_list) - 1 end_int_list[i] += end_or_len - 1 while end_int_list[i] >= seq_len: j = end_int_list[i] // seq_len end_int_list[i] = end_int_list[i] % seq_len if i == 0: end_int_list.insert(0, j-1) else: i -= 1 end_int_list[i] += j else: end_int_list = [sequence.find(c) for c in end_or_len] while len(start_int_list) < len(end_int_list) or start_int_list <= end_int_list: yield ''.join([sequence[i] for i in start_int_list]) i = len(start_int_list)-1 start_int_list[i] += 1 while start_int_list[i] >= seq_len: start_int_list[i] = 0 if i == 0: start_int_list.insert(0,0) else: i -= 1 start_int_list[i] += 1 if __name__ =='__main__': import doctest doctest.testmod() 

¿Qué hay de cortar una lista ya preestablecida?

 import string s = string.ascii_lowercase print( s[ s.index('b'):s.index('o')+1 ] ) 

El ejemplo de Malcom funciona muy bien, pero hay un pequeño problema debido a cómo funciona la comparación de listas de Pythons. Si ‘A’ a “Z” o algún carácter a “ZZ” o “ZZZ” causará una iteración incorrecta.

Aquí “AA” <"Z" o "AAA" <"ZZ" se volverán falsos.

En Python [0,0,0] es menor que [1,1] en comparación con el operador “<" o ">“.

Así que debajo de la línea

 while len(start_int_list) < len(end_int_list) or start_int_list <= end_int_list: 

debe ser reescrito como a continuación

 while len(start_int_list) < len(end_int_list) or\ ( len(start_int_list) == len(end_int_list) and start_int_list <= end_int_list): 

Está bien explicado aquí https://docs.python.org/3/tutorial/datastructures.html#comparing-sequences-and-other-types

Reescribí el siguiente ejemplo de código.

 def strange(start, end_or_len, sequence='ABCDEFGHIJKLMNOPQRSTUVWXYZ'): seq_len = len(sequence) start_int_list = [sequence.find(c) for c in start] if isinstance(end_or_len, int): inclusive = True end_int_list = list(start_int_list) i = len(end_int_list) - 1 end_int_list[i] += end_or_len - 1 while end_int_list[i] >= seq_len: j = end_int_list[i] // seq_len end_int_list[i] = end_int_list[i] % seq_len if i == 0: end_int_list.insert(0, j-1) else: i -= 1 end_int_list[i] += j else: end_int_list = [sequence.find(c) for c in end_or_len] while len(start_int_list) < len(end_int_list) or\ (len(start_int_list) == len(end_int_list) and start_int_list <= end_int_list):** yield ''.join([sequence[i] for i in start_int_list]) i = len(start_int_list)-1 start_int_list[i] += 1 while start_int_list[i] >= seq_len: start_int_list[i] = 0 if i == 0: start_int_list.insert(0,0) else: i -= 1 start_int_list[i] += 1 

De todos modos, el ejemplo de código de Malcom es una gran ilustración de cómo funciona el iterador en Python.