Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的递增字符串_Python - Fatal编程技术网

Python中的递增字符串

Python中的递增字符串,python,Python,我正在编写一个函数来递增一个3个字母(a-z)的字符串。例如: 输入:aaa 输出:baa 输入:zba 输出:aca 所以顺序如下 aaa baa ... zaa aba bba cba ... zba aca bca cca ... zca ada ... zzz aaa 我编写了以下函数next\u code(),它可以工作,但我想知道是否有一种更优雅的方法来实现它,而不是通过字符串中的单个字母循环: # 0 = a; 25 = z def digit_to_char(digit):

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

输入:zba
输出:aca

所以顺序如下

aaa
baa
...
zaa
aba
bba
cba
...
zba
aca
bca
cca
...
zca
ada
...
zzz
aaa
我编写了以下函数
next\u 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'))

只需使用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

strings = itertools.cycle(itertools.product(*[ascii_lowercase]*3))

您可以大大简化循环:

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
可用于生成生成器:

from future_builtins import map  # Only on Python 2
from itertools import product

def allcodes():
    # You want the left side to vary faster, so reverse before joining
    return map(''.join, map(reversed, product(string.ascii_lowercase, repeat=3)))

for code in allcodes():
    print(code)
或者,您可以根据需要调用它,以获取序列中的下一个代码,而无需将其用作迭代器:

nextcode = allcodes().__next__  # .next on Py2
如果生成器应该是无限的(因此它从
zzz
包装到
aaa
),只需将
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))))

哇,很好的回答。。。你从我这里为这个家伙打了这么多垒:)@JoranBeasley:TIMTOWTDI?:-)我喜欢找到它们。我从Perl开始。谢谢,+1提供了一个非常简洁的解决方案。不幸的是,它不支持输入(从中获取下一个值),但应该不难添加。