在perl中,要获取从“a”到“azc”的所有字符串的列表,要做的只是使用范围运算符:
perl -le 'print "a".."azc"'
我想要的是一个字符串列表:
["a", "b", ..., "z", "aa", ..., "az" ,"ba", ..., "azc"]
我想我可以使用ord
和chr
,一遍又一遍地循环,这对于“a”到“z”很简单,例如:
>>> [chr(c) for c in range(ord("a"), ord("z") + 1)]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
但对我的情况来说有点复杂,在这里。
感谢您的帮助!
答案 0 :(得分:4)
纯粹基于迭代器的建议:
import string
import itertools
def string_range(letters=string.ascii_lowercase, start="a", end="z"):
return itertools.takewhile(end.__ne__, itertools.dropwhile(start.__ne__, (x for i in itertools.count(1) for x in itertools.imap("".join, itertools.product(letters, repeat=i)))))
print list(string_range(end="azc"))
答案 1 :(得分:4)
生成器版本:
from string import ascii_lowercase
from itertools import product
def letterrange(last):
for k in range(len(last)):
for x in product(ascii_lowercase, repeat=k+1):
result = ''.join(x)
yield result
if result == last:
return
编辑: @ihightower在评论中提问:
如果我想从'b'打印到'azc',我不知道该怎么做。
所以你想从'a'
以外的东西开始。只需丢弃起始值之前的任何内容:
def letterrange(first, last):
for k in range(len(last)):
for x in product(ascii_lowercase, repeat=k+1):
result = ''.join(x)
if first:
if first != result:
continue
else:
first = None
yield result
if result == last:
return
答案 2 :(得分:2)
在itertools中使用产品调用,在字符串中使用ascii_letters。
from string import ascii_letters
from itertools import product
if __name__ == '__main__':
values = []
for i in xrange(1, 4):
values += [''.join(x) for x in product(ascii_letters[:26], repeat=i)]
print values
答案 3 :(得分:1)
虽然您需要转换功能,但这是一种更好的方法:
for i in xrange(int('a', 36), int('azd', 36)):
if base36encode(i).isalpha():
print base36encode(i, lower=True)
这是你的功能(谢谢你Wikipedia):
def base36encode(number, alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', lower=False):
'''
Convert positive integer to a base36 string.
'''
if lower:
alphabet = alphabet.lower()
if not isinstance(number, (int, long)):
raise TypeError('number must be an integer')
if number < 0:
raise ValueError('number must be positive')
# Special case for small numbers
if number < 36:
return alphabet[number]
base36 = ''
while number != 0:
number, i = divmod(number, 36)
base36 = alphabet[i] + base36
return base36
我添加了小写转换选项,以防你想要它。
答案 4 :(得分:1)
我将接受的答案概括为能够从中间开始并使用除小写以外的其他答案:
from string import ascii_lowercase, ascii_uppercase
from itertools import product
def letter_range(first, last, letters=ascii_lowercase):
for k in range(len(first), len(last)):
for x in product(letters, repeat=k+1):
result = ''.join(x)
if len(x) != len(first) or result >= first:
yield result
if result == last:
return
print list(letter_range('a', 'zzz'))
print list(letter_range('BA', 'DZA', ascii_uppercase))
答案 5 :(得分:0)
def strrange(end):
values = []
for i in range(1, len(end) + 1):
values += [''.join(x) for x in product(ascii_lowercase, repeat=i)]
return values[:values.index(end) + 1]