所有字符串按字典顺序大于X且小于Y.

时间:2015-03-29 06:11:59

标签: python string lexicographic

如何在“python”中找到字典大于X且小于Y的所有字符串? X和Y的长度相同。

示例:

X = "ab" and Y = "ad"

所以答案是:

"ab", "ac" and "ad"

我该怎么做?

4 个答案:

答案 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')
相关问题