2012-01-28 8 views
9

In altre lingue, vorrei utilizzare un costrutto come questo:Qual è il modo pitone di generare una serie di caratteri?

a..z 

io non poteva trovare una soluzione migliore di questa:

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

C'è un modo più leggibile più breve costruire una tale lista?

+0

Nel tentativo di dissuadere le persone dal rispondere con esso, sto andando per citare ['string.lowercase'] (http: //docs.python.o rg/library/string.html # string.lowercase) in un commento, ma funziona solo se si desidera l'intero alfabeto (** Modifica **: ... sigh) –

+1

Sì, _string.lowercase_ potrebbe essere utilizzato, è anche una soluzione leggibile, ma funziona solo se si desidera l'intero alfabeto. Vorrei davvero poter fare qualcosa come _range ("a", "c") _ – Jeremy

+2

Penso che questa soluzione sia davvero bella. Ma come è ora, va solo da 'a' a' y', 'ord ('z') + 1' dovrebbe risolvere il problema – juliomalegria

risposta

6

Non necessariamente grande se si vuole fare qualcosa di diverso dalla A alla Z, ma si può fare questo:

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

Abbastanza grande per altre gamme che 'a..z', perché puoi facilmente prendere una porzione di' ascii_lowercase'. –

+2

@larsmans Facilmente ... come? Altro che convertire manualmente i caratteri finali in offset nella tua testa, che tipo di sconfigge il punto –

0

È possibile sostituire la comprensione lista con una chiamata map(chr,range(ord('a'),ord('z')+1)), ma non è forse quello che si' sto davvero chiedendo. L'esempio che mostri, tuttavia, viene importato più appropriatamente; è disponibile come stringa in string.lowercase.

Supponendo che le lettere coincidano con gli ordinali potrebbe essere un errore, considerando lettere come ß e æ, che possono essere ordinate in modo diverso a seconda delle località (cioè åäö sono le ultime in alfabeto per svedese, ma ä e ö sono varianti di a e o in tedesco). Ecco perché abbiamo funzioni come unicode.islower() e locale.strcoll().

1

Il mio modo è simile al vostro ma è possibile utilizzare map e creare una funzione arbitraria come questo

>>> 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

c'è niente di sbagliato con la vostra lista-di comprensione, ma forse si vuole provare:

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'] 

Come notato da julio.alegria e Nathan Binkert lowercase è una stringa di tutte le lettere minuscole e le stringhe Python sono iterabili.

Se avete bisogno di sottoinsiemi dell'alfabeto, ci sono modi piacevoli e divinatorio per farlo:

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

Come notato altrove, le lettere 'a' a 'z' sono già in string.lowercase. Quindi puoi solo prenderne una fetta.

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 

uscita:

ghijklmn

1

Ancora un'altra opzione:

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

Non sai perché pensi che una selezione di lettere casuali sia il risultato desiderato. – hughdbrown

Problemi correlati