有没有办法像这样在python中做一个字母范围:
for x in range(a,h,)
就像是:
[chr(i) for i in range(ord('a'),ord('h'))]
将给出一个字母字符列表进行迭代,然后您可以在循环中使用它
for x in [chr(i) for i in range(ord('a'),ord('h'))]:
print(x)
或者这将做同样的事情:
for x in map(chr, range(*map(ord,['a', 'h']))):
print(x)
您可以使用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'
只要一个人只要求一系列单个字符,Emanuele 的解决方案就很棒,我承认这是最初的提问者提出的。还有一些解决方案可以生成所有多字符组合:如何生成从 aa... 到 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()
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
没有内置的字母范围,但你可以写一个:
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
这至少对我来说更容易阅读/理解(并且您可以轻松自定义包含哪些字母,以及以什么顺序):
letters = 'abcdefghijklmnopqrstuvwxyz'
for each in letters:
print each
result:
a
b
c
...
z
有时人们可能会过度设计一个简单的解决方案。如果你知道你想要的字母范围,为什么不直接使用:
for letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
print(letter)
甚至:
start = 4
end = 9
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for letter in alphabet[start:end]:
print(letter)
在第二个示例中,我说明了一种从固定列表中选择所需字母数量的简单方法。
切片一个已经预先安排好的列表怎么样?
import string
s = string.ascii_lowercase
print( s[ s.index('b'):s.index('o')+1 ] )
Malcom 的示例效果很好,但是由于 Python 列表比较的工作方式存在一个小问题。如果 'A' 到 "Z" 或某些字符到 "ZZ" 或 "ZZZ" 将导致不正确的迭代。
这里 "AA" < "Z" 或 "AAA" < "ZZ" 将变为假。
在 Python 中,与“<”或“>”运算符相比,[0,0,0] 小于 [1,1]。
所以下线
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 中的迭代器是如何工作的。