【问题标题】:All the strings lexicographically greater than X and smaller than Y所有按字典顺序大于 X 且小于 Y 的字符串
【发布时间】:2015-03-29 06:11:59
【问题描述】:

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

例子:

X = "ab" and Y = "ad"

所以答案是:

"ab", "ac" and "ad"

我该怎么做?

【问题讨论】:

  • 使用哪种语言?英语?法语?德语?
  • @PeterWood:编辑了问题陈述。它在 Python 中
  • 你尝试了什么?什么不起作用?
  • 抱歉,我的意思是订购来自哪种语言?我们只使用 ASCII 字符串还是 unicode?​​span>
  • 请记住,如果 X='af'; Y='cg' 则 'b[a..z]' 将满足要求 - 这可能会变得非常大 - 您还在寻找大小写独立性,即 'A'..' b' 包括 'B'..'Z'、'a'。

标签: python string lexicographic


【解决方案1】:

我认为您正在寻找的答案是:

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 的字符串。
【解决方案2】:

您可以将其视为从基数 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】:

    你可以从一些伪代码开始:

    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
    

    【讨论】:

    • 我猜你的next 函数是错误的。我会在第一种情况下使用return str[:-1] + chr(ord(str[-1]) + 1),在第二种情况下使用return next(str[:-1]) + 'a'
    【解决方案4】:

    首先,让我们编写一个函数来查找当前字符串之后的按字典顺序排列的下一个字符串(具有相同的长度,并且仅使用字符 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')
    

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2013-02-06
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多