簡體   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