Python中的递增字符串

2024-06-03 14:18:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个函数来增加一个3个字母(a-z)的字符串。例如:
输入:aaa
输出:baa

输入:zba
输出:aca

所以顺序如下

aaa
baa
...
zaa
aba
bba
cba
...
zba
aca
bca
cca
...
zca
ada
...
zzz
aaa

我编写了下面的函数next_code(),它可以工作,但是我想知道是否有一种更优雅的方法来实现它,而不是在字符串中循环使用单个字母:

^{pr2}$

Tags: 函数字符串顺序字母aaabbaabazca
2条回答

您可以大大简化循环:

def next_code(code):
    code = list(code)
    for i, let in enumerate(code):
        if let != 'z':
            code[i] = chr(ord(let) + 1)
            break
        code[i] = 'a'
    return ''.join(code)

如果目标只是逐个生成所有值,从'aaa'开始,itertools.product可用于生成生成器:

^{pr2}$

或者将它设置为一个函数,根据需要调用该函数以获取序列中的下一个代码,而不将其用作迭代器:

nextcode = allcodes().__next__  # .next on Py2

如果生成器应该是无限的(因此它从zzz包装到{}),只需将allcodes更改为以下任意一个:

# Avoid cycle if storing all 26**3 codes in memory is a bad idea
def allcodes():
    while True:
        yield from map(''.join, map(reversed, product(string.ascii_lowercase, repeat=3)))
        # On Py2, change yield from line to:
        # for code in map(''.join, map(reversed, product(string.ascii_lowercase, repeat=3))): yield code

或者使用更高的内存成本但更简单:

from itertools import cycle

def allcodes():
    return cycle(map(''.join, map(reversed, product(string.ascii_lowercase, repeat=3))))

只需使用itertools产品

>>> import itertools
>>> from string import ascii_lowercase
>>> strings = itertools.product(*[ascii_lowercase]*3)
>>> "".join(next(strings,"No More Combos..."))
'aaa'
>>> "".join(next(strings,"No More Combos..."))
'aab'
>>> "".join(next(strings,"No More Combos..."))
'aac'
...

我可能会怎么做

如果你想在结束后循环回“aaa”,你可以使用itertools.cycle公司在

^{pr2}$

相关问题 更多 >