2013-02-17 11 views
5

Czy istnieje sposób, aby zrobić szereg się w pytona tak:Czy można utworzyć zakres liter w pythonie?

for x in range(a,h,) 
+2

możliwe dup z http://stackoverflow.com/questions/7001144/range-over-character-in-python i http://stackoverflow.com/questions/3190122/python-how-to-print -range-az (z których każdy ma wiele dobrych odpowiedzi) – fantabolous

Odpowiedz

3

Można użyć ord() konwertować litery do porządkowych znakowych i tył:

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

Wydaje się działać dobrze :

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

nie ma wbudowany w zakresie list, ale można napisać jedno:

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, 

drukuje:

a b c d e f g 
13

podobnie jak:

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

(lub może:

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

)

+3

Pamiętaj, że nie zawiera to ostatniej litery, więc jeśli chcesz zrobić cały alfabet, możesz zrobić coś takiego: [chr (i) dla i w zakresie (ord ("a"), ord ("z") + 1] – seddonym

2
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')) 

wynik

a b c d e f g 
1

jest to łatwiejsze dla mnie przynajmniej do odczytu/zrozumieć (i można łatwo dostosować listów, które są wliczone w cenę, w jakiej kolejności):

letters = 'abcdefghijklmnopqrstuvwxyz' 
for each in letters: 
    print each 

result: 
a 
b 
c 
... 
z 
+0

... nowy na stronie, jak zrobić, aby blok kodu wyglądał poprawnie? (w przeciwieństwie do tego, co umieściłem powyżej?) – Joey

+0

wybierz kod i naciśnij przycisk '{}' lub wcięcie każdej linii kodu co najmniej czterema spacjami – user3288829

0

rozwiązanie Emanuele jest wielka, jak tak długo, jak się tylko prosi o szereg pojedynczych znaków, co przyznaję, jest tym, co zadał pierwotny pytający. Istnieją również rozwiązania, które umożliwiają generowanie wszystkich kombinacji wielu znaków: How to generate a range of strings from aa... to zz. Podejrzewam jednak, że ktoś, kto chce takiej postaci, jak funkcja zakresu, może chcieć poradzić sobie z generowaniem dowolnego zakresu od "y" do "af" (przechodzenie z "z" na "aa"). Oto ogólne rozwiązanie, które obejmuje możliwość określenia ostatniego członka zakresu lub jego długości.

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() 
Powiązane problemy