在Python中按字典顺序生成字符串

问题描述

我该如何编写Python生成器来惰性生成所有字符串,这些字符串由不超过一定长度的小写英文字母组成? 1

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


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

解决方法

这是我的解决方案:

ab

示例:

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的字符串,这是无效的,因为Python会生成副本中间结果(因为字符串是不可变的)。

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

m