2013-02-17 29 views
5

böyle python yazmak aralığını yapmak için bir yolu var mı:Python'da bir harf aralığı yapmak mümkün mü?

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

olası dup http://stackoverflow.com/questions/7001144/range-over-character-in-python ve http://stackoverflow.com/questions/3190122/python-how-to-print -range-az (her biri çok iyi cevapları vardır) – fantabolous

cevap

3

Sen karakter ordinals içine harfleri dönüştürmek ve yedeklemek için ord() kullanabilirsiniz:

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

Sadece iyi çalışıyor görünüyor :

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

harf yok aralığında inşa yoktur, ancak yazabilir biri:

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, 

baskılar:

a b c d e f g 
13

şey gibi:

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

(ya da belki:

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

)

+3

Bu son harfi içermediğini unutmayın, bu nedenle eğer tüm alfabeyi yapmak isterseniz, aşağıdaki gibi bir şey yaparsınız: [chr (i) Ben aralıkta (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')) 

sonuç

a b c d e f g 
1

bu beni en azından okuma/anlama için (ve kolayca özelleştirebilirsiniz dahil hangi harfleri ve hangi sırayla) daha kolaydır:

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

result: 
a 
b 
c 
... 
z 
+0

... siteye yeni, nasıl bir kod bloğu doğru bir şekilde görünebilirim? (Yukarıda yazdığımın aksine) – Joey

+0

kodu seçin ve '{}' düğmesine basın veya her kod satırını en az dört boşluk girintisine – user3288829

0

Emanuele çözümü olarak büyük Biri sadece tek bir karakter için sorduğum sürece, itiraf edeceğim orijinal sorgunun ne olduğudır. Tüm çok karakterli kombinasyonları üretmek için orada çözümler de var: How to generate a range of strings from aa... to zz. Bununla birlikte, menzil işlevi gibi bir karakter isteyen birinin, 'y' den 'af' ye ('z' den 'aa' ye yuvarlanarak) keyfi bir aralık oluşturmakla uğraşmak isteyebileceğinden şüpheleniyorum. Bu yüzden, ya aralığın son üyesini ya da uzunluğunu belirtme yeteneğini içeren daha genel bir çözüm. arasında

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() 
İlgili konular