繁体   English   中英

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

[英]Generate strings in lexicographical order in Python

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

我已经编写了自己的解决方案(作为答案发布在下面),但我想看看是否有更优雅/高效/有趣的解决方案。


1无限迭代器将毫无用处,因为它只会生成仅由字符a组成的字符串。 这是因为字符串的词典式排序是不是一个良序关系; 它可以被认为是由无限嵌套的序列组成的无限序列:( a , ( aa , ...), ( ab , ...), ...), ( b , ( ba , ...) , ( bb , ...), ...), ... 生成器永远不会到达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次来生成长度为m的字符串,这效率不高,因为 Python 生成中间结果的副本(因为字符串是不可变的)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM