2013-02-17 7 views

答えて

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

は決して手紙の範囲に組み込まれていませんが、あなたは書くことができます1:

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

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

+0

コードを選択して '{}'ボタンを押すか、各コード行を少なくとも4つのスペースでインデントします – user3288829

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() 
関連する問題