2013-02-17 83 views
5

有沒有辦法做了一封信範圍在Python這樣的:是否可以在python中創建一個字母範圍?

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

可能DUP http://stackoverflow.com/questions/7001144/range-over-character-in-python和http://stackoverflow.com/questions/3190122/python-how-to-print -range-az(其中每個都有很多很好的答案) – fantabolous 2015-02-05 08:37:09

回答

3

您可以使用ord()的字母轉換成字符序和背部:

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

這似乎只是正常工作:

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

中有字母範圍內無建的,但你可以寫一個:

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, 

打印:

a b c d e f g 
13

喜歡的東西:

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

(或者:

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

+3

請注意,這不包括最後一個字母,所以如果你想要做整個字母表,你會這樣做: [chr(i)for我在範圍內(ord('a'),ord('z')+ 1] – seddonym 2013-05-22 14:17:22

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

結果

a b c d e f g 
1

這容易,我至少讀/瞭解(你可以輕鬆地定製的字母都包括在內,以及以什麼順序):

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

result: 
a 
b 
c 
... 
z 
+0

...新的網站,我該如何使代碼塊正確顯示?(與我上面提到的相反) – Joey 2015-08-18 01:52:26

+0

選擇代碼並點擊「{}」按鈕,或者縮進每個代碼行至少四個空格 – user3288829 2015-08-18 01:57:28

0

埃馬努埃萊的解決方案是偉大的,因爲只要一個人只要求一系列單個角色,我承認這是最初的提問者提出的。還有解決方案可以生成所有多字符組合:How to generate a range of strings from aa... to zz。但是我懷疑想要像範圍函數這樣的字符的人可能希望能夠處理從「y」到「af」(從「z」滾動到「aa」)的任意範圍。所以這裏是一個更通用的解決方案,它包括指定範圍的最後一個成員或其長度的能力。的

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() 
相關問題