2012-05-23 11 views
6

Tengo cadenas que describen un rango de caracteres alfabéticamente, formado por dos caracteres separados por un guión. Me gustaría ampliar a cabo en una lista de los caracteres individuales de esta manera:Expandir el rango alfabético a la lista de caracteres en Python

'a-d' -> ['a','b','c','d'] 
'B-F' -> ['B','C','D','E','F'] 

¿Cuál sería la mejor manera de hacer esto en Python?

Respuesta

11
In [19]: s = 'B-F' 

In [20]: list(map(chr, range(ord(s[0]), ord(s[-1]) + 1))) 
Out[20]: ['B', 'C', 'D', 'E', 'F'] 

El truco es convertir ambos personajes a sus códigos ASCII, y luego usar range().

P.S. Como necesita una lista, la construcción list(map(...)) se puede reemplazar por una lista de comprensión.

+0

Si la entrada no es una cadena, se puede poner el caracteres deseados justo en la expresión. Quería letras de archivo que comenzaran con 'a', entonces map (chr, range (ord ('a'), ord ('a') + 5)) –

1
import string 

def lis(strs): 
    upper=string.ascii_uppercase 
    lower=string.ascii_lowercase 

    if strs[0] in upper:   
     return list(upper[upper.index(strs[0]): upper.index(strs[-1])+1]) 
    if strs[0] in lower: 
     return list(lower[lower.index(strs[0]): lower.index(strs[-1])+1]) 

print(lis('a-d')) 
print(lis('B-F')) 

de salida:

['a', 'b', 'c', 'd'] 
['B', 'C', 'D', 'E', 'F'] 
4

Junto con aix's excellent answer usando map(), se puede hacer esto con una lista por comprensión:

>>> s = "A-F" 
>>> [chr(item) for item in range(ord(s[0]), ord(s[-1])+1)] 
['A', 'B', 'C', 'D', 'E', 'F'] 
Cuestiones relacionadas