2012-01-28 11 views
9

W innych językach, użyłbym konstrukt takiego:Jaki jest pythonic sposób generowania zakresu znaków?

a..z 

nie mogłem wymyślić lepszego rozwiązania niż to:

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

istnieje krócej, bardziej czytelny sposób budowanie takiej listy?

+0

W celu odwieść ludzi od odpowiedzi z nim, zamierzam wspomnieć o ['string.lowercase'] (http: //docs.python.o rg/library/string.html # string.lowercase) w komentarzu, ale działa tylko jeśli chcesz mieć cały alfabet (** Edit **: ... sigh) –

+1

Tak, _string.lowercase_ może być użyty, to także czytelne rozwiązanie, ale działa tylko wtedy, gdy chcesz mieć cały alfabet. Naprawdę chciałbym móc zrobić coś takiego, jak _range ("a", "c") _ – Jeremy

+2

Myślę, że to rozwiązanie jest naprawdę ładne. Ale tak jak teraz, po prostu przechodzi od 'a' do' y', 'ord ('z') + 1' powinno rozwiązać problem: – juliomalegria

Odpowiedz

6

Niekoniecznie wielki, jeśli chcesz zrobić coś innego niż A do Z, ale można to zrobić:

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

Bardzo dobre dla innych zakresów niż 'a..z', ponieważ możesz z łatwością wziąć plasterek' ascii_lowercase'. –

+2

@ larsmans Łatwo ... jak? Poza ręczną zamianą znaków końca na przesunięcia w twojej głowie, które pokonują punkt –

0

Można wymienić listowych z map(chr,range(ord('a'),ord('z')+1)) rozmowy, ale to nie jest być może to, co” naprawdę pytam. Jednak przykład, który pokazujesz, jest bardziej odpowiednio zaimportowany; jest dostępny jako ciąg znaków w string.lowercase.

Założenie, że litery pasują do rzędów, może być błędem, biorąc pod uwagę litery takie jak ß i æ, które mogą być sortowane w różny sposób w zależności od miejsc (np. Åäö są ostatnio w alfabecie szwedzkim, ale ä i ö są wariantami a i o w języku niemieckim). Dlatego mamy funkcje takie jak unicode.islower() i locale.strcoll().

1

Mój sposób jest podobny do Ciebie, ale można użyć map i stworzyć dowolną funkcję jak ten

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

Nie ma nic złego z listy-rozumienia, ale może chcesz spróbować:

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

Jak zauważyli julio.alegria i Nathan Binkert lowercase jest ciągiem wszystkich małych liter, a ciągi w języku Python to iterables.

Jeśli wymagają podzbiory alfabetu, są ładne i pythonic sposobów, aby to zrobić:

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

Jak wspomniano gdzie indziej, litery „a” do „Z” są już w string.lowercase. W ten sposób możesz po prostu wziąć kawałek tego.

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 

wyjściowa:

ghijklmn

1

Jeszcze inna opcja:

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

Nie wiesz, dlaczego uważasz, że wybór losowych liter jest pożądanym rezultatem. – hughdbrown

Powiązane problemy