如何在Python中获取下一个按字母数字顺序排列的字符串?

5 投票
4 回答
4288 浏览
提问于 2025-04-15 11:57

我需要一个简单的程序,给定一个字符串,它能返回下一个按字母和数字顺序排列的字符串(或者仅仅是按字母顺序排列的字符串)。

f("aaa")="aab"
f("aaZ")="aba"

然后继续。

有没有现成的模块里有这样的函数呢?

4 个回答

2

这里有一个不同的解决方案,虽然比较长,但可能更容易理解和灵活:

def toval(s):
    """Converts an 'azz' string into a number"""
    v = 0
    for c in s.lower():
        v = v * 26 + ord(c) - ord('a')
    return v

def tostr(v, minlen=0):
    """Converts a number into 'azz' string"""
    s = ''
    while v or len(s) < minlen:
        s = chr(ord('a') + v % 26) + s
        v /= 26
    return s

def next(s, minlen=0):
    return tostr(toval(s) + 1, minlen)

s = ""
for i in range(100):
    s = next(s, 5)
    print s

你可以把字符串转换成一个数字,每个字母代表一个26进制的数字,然后把这个数字加一,再把它转换回字符串。这样,你就可以对用字母表示的值进行各种数学运算。

''minlen''这个参数控制结果会有多少位数(因为0等于a,a也等于aaaaa)。

3

在这个链接里,大家讨论的是“如何把这段代码从Perl语言转换成Python语言”。虽然这些回答可能不是完全符合你的问题,但大致上是接近的。

12

我觉得没有现成的函数可以做到这一点。下面的代码应该可以实现:

def next_string(s):
    strip_zs = s.rstrip('z')
    if strip_zs:
        return strip_zs[:-1] + chr(ord(strip_zs[-1]) + 1) + 'a' * (len(s) - len(strip_zs))
    else:
        return 'a' * (len(s) + 1)

解释一下:你需要找到最后一个不是 z 的字符,把它加一,然后把它后面的所有字符都替换成 a。如果整个字符串都是 z,那么就返回一个比原来多一个字符的全是 a 的字符串。

撰写回答