问题描述
我该如何编写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