2013-02-17 43 views
5

वहाँ इस तरह अजगर में एक पत्र रेंज करने के लिए एक रास्ता है:क्या पाइथन में एक अक्षर सीमा बनाना संभव है?

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 -रेंज-एज़ (जिनमें से प्रत्येक के बहुत अच्छे जवाब हैं) – fantabolous

उत्तर

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) के लिए मैं रेंज में (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

कोड का चयन करें और '{}' बटन दबाएं, या प्रत्येक कोड लाइन को कम से कम चार रिक्त स्थान दें – 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()