【问题标题】:Generate strings in lexicographical order in Python在 Python 中按字典顺序生成字符串
【发布时间】:2023-04-07 21:55:01
【问题描述】:

如何编写一个 Python 生成器来懒惰地生成由不超过一定长度的小写英文字母组成的所有字符串1

我已经编写了自己的解决方案 (posted below as an answer),但我想看看有没有更优雅/高效/有趣的解决方案。


1 无限迭代器将毫无用处,因为它只会生成仅由字符 a 组成的字符串。这是因为字符串的字典顺序不是well-order;它可以被认为是由无限嵌套序列的无限序列组成:(a, (aa, ...), (ab, ...), ...), (b , (ba, ...), (bb, ...), ...), ... 生成器永远不会到达ab,因为它有无限数量的前辈。

【问题讨论】:

    标签: python generator lazy-sequences lexicographic


    【解决方案1】:

    这是我的解决方案:

    import string
    
    
    def lexstrings(max_length: int, alphabet=string.ascii_lowercase):
        yield ""
        if max_length == 0: return
        for first in alphabet:
            for suffix in lexstrings(max_length - 1, alphabet=alphabet):
                yield first + suffix
    

    例子:

    >>> g = lexstrings(max_length=3, alphabet="ab")
    >>> list(g)
    ['',
     'a',
     'aa',
     'aaa',
     'aab',
     'ab',
     'aba',
     'abb',
     'b',
     'ba',
     'baa',
     'bab',
     'bb',
     'bba',
     'bbb']
    

    这可能不是最好的解决方案,因为它涉及递归和使用 + 运算符 m 次生成长度为 m 的字符串,这效率不高,因为 Python 会生成中间结果的副本(因为字符串是不可变的)。

    此实现还“支持”无限版本:

    >>> g = lexstrings(-1)
    >>> next(g)
    ''
    >>> next(g)
    'a'
    >>> next(g)
    'aa'
    >>> next(g)
    'aaa'
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 2018-05-29
      相关资源
      最近更新 更多