在Python中增加字符串

Max*_*aga 0 python

我正在编写一个函数来增加一个3个字母(az)的字符串.例如:
输入: aaa
输出:baa

输入: zba
输出:aca

所以订单如下

aaa
baa
...
zaa
aba
bba
cba
...
zba
aca
bca
cca
...
zca
ada
...
zzz
aaa
Run Code Online (Sandbox Code Playgroud)

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

# 0 = a; 25 = z
def digit_to_char(digit):
    return chr(ord('a') + digit)

# a = 0; z = 25
def char_to_digit(char):
    return ord(char)-ord('a')

def next_code(code):
    # if used up all codes, loop from start
    if code == 'zzz':
        return next_code('aaa')
    else:
        code = list(code)
        # loop over letters and see which one we can increment
        for (i, letter) in enumerate(code):
            if letter == 'z':
                # go on to the next letter
                code[i] = 'a'
                continue
            else:
                # increment letter
                code[i] = digit_to_char(char_to_digit(letter) + 1)
                return ("".join(code))
                break



print (next_code('aab'))
Run Code Online (Sandbox Code Playgroud)

Jor*_*ley 6

只需使用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'
...
Run Code Online (Sandbox Code Playgroud)

是我可能会这样做的

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

strings = itertools.cycle(itertools.product(*[ascii_lowercase]*3))
Run Code Online (Sandbox Code Playgroud)