是否可以在python中创建一个字母范围?

时间:2013-02-17 22:58:20

标签: python python-3.x

有没有办法在python中执行这样的字母范围:

for x in range(a,h,)

9 个答案:

答案 0 :(得分:13)

类似的东西:

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

(或者可能:

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

答案 1 :(得分:4)

您可以使用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 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:1)

这对我来说更容易阅读/理解(并且您可以轻松自定义包含哪些字母,以及以何种顺序):

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

result:
a
b
c
...
z

答案 5 :(得分:1)

Emanuele的解决方案很棒,只要一个人只要求一系列单个字符,我承认这是原始提问者所提出的。还有解决方案可以生成所有多字符组合:How to generate a range of strings from aa... to zz。但是我怀疑那些想要像范围函数这样的角色的人可能希望能够处理生成一个任意范围,比如说' y'到了' af' (从' z'到#39; 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()

答案 6 :(得分:0)

如何切片已经预先安排的列表?

import string

s = string.ascii_lowercase
print( s[ s.index('b'):s.index('o')+1 ] )

答案 7 :(得分:0)

Malcom的例子效果很好,但由于Pythons列出比较的工作原理,因此存在一些问题。如果“A”到“Z”或某些字符到“ZZ”或“ZZZ”将导致错误的迭代。

这里“AA”&lt; “Z”或“AAA”&lt; “ZZ”将变为虚假。

与“&lt;”相比,Python [0,0,0]小于[1,1]或“&gt;”操作

如下线

while len(start_int_list) < len(end_int_list) or start_int_list <= end_int_list:

应改写如下

while len(start_int_list) < len(end_int_list) or\
        ( len(start_int_list) == len(end_int_list) and start_int_list <= end_int_list):

这里有很好的解释 https://docs.python.org/3/tutorial/datastructures.html#comparing-sequences-and-other-types

我重写了下面的代码示例。

def strange(start, end_or_len, sequence='ABCDEFGHIJKLMNOPQRSTUVWXYZ'):

    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\
         (len(start_int_list) == len(end_int_list) and 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

无论如何,Malcom的代码示例很好地说明了Python中迭代器的工作原理。

答案 8 :(得分:0)

有时人们可能会过度设计一个简单的解决方案。 如果你知道你想要的字母范围,为什么不直接使用:

for letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
    print(letter)

甚至:

start = 4
end = 9
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for letter in alphabet[start:end]:
    print(letter)

在第二个示例中,我展示了一种从固定列表中选择所需字母的简单方法。