如何在“python”中找到字典大于X且小于Y的所有字符串? X和Y的长度相同。
示例:
X = "ab" and Y = "ad"
所以答案是:
"ab", "ac" and "ad"
我该怎么做?
答案 0 :(得分:0)
你可以从一些伪代码开始:
lower=...
upper=...
str = next(lower)
while before(str, upper) :
print(str)
str = next(str)
next
功能:
def next (str) :
if str[-1] != 'z' :
return str[:-1] + chr(ord(str[-1]) + 1) # increment last char
else:
return next( str[0:-1] ) + 'a' # reset last char and increment previous
before
功能:
def before (a, b) :
for i in 0.. (len(a)-1) :
if a[i] < b[i] :
return True
return False
答案 1 :(得分:0)
我认为您正在寻找的答案是:
X = 'ab'
Y = 'ad'
x = [chr(x) + chr(y) for x in range(ord(X[0]),ord(Y[0])+1) for y in range(ord(X[1]),ord(Y[1])+1)]
print(x)
答案 2 :(得分:0)
您可以将其视为从基数26转换为获取一系列整数,然后将这些整数转换回基数26.您可以为此自行滚动,或pip install python-baseconv
,例如:
from string import ascii_lowercase
from baseconv import BaseConverter
def lex_range(start, end):
if len(start) != len(end):
raise ValueError('inputs must be same length')
B26 = BaseConverter(ascii_lowercase)
# use `xrange` in Py 2.x
for n in range(int(B26.decode(start)), int(B26.decode(end)) + 1):
yield B26.encode(n).rjust(len(start), 'a')
for result in lex_range('ab', 'ad'):
print(result)
注意 - 只要他们按字典顺序排列start <= end
,上述内容就会有效 - 他们不需要长度相同,所以lex_range('a', 'zz')
仍然会产生所需的输出 - 因此显式len
检查。
输出:
# ab
# ac
# ad
答案 3 :(得分:0)
首先,让我们编写一个函数,在当前(具有相同的长度,仅使用字符a-z)之后找到按字典顺序排列的下一个字符串,即增加它。在大多数情况下,这很简单 - 只需增加最后一个字符。但是,如果最后一个字符是我们的集合(z)中可能性最高的字符,我们从a开始,并增加剩余的字符串。
def next(s):
front = s[:-1]
last = s[-1]
if last < 'z':
return front + chr(ord(last) + 1)
else:
return next(front) + 'a'
现在我们可以用它来打印给定范围内的所有字符串:
def print_between(start, end):
s = start
while s <= end:
print (s)
s = next(s)
示例:
print_between('ab', 'ad')