加字符在前面加一个字符

2024-10-03 09:16:49 发布

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

我要实现的是一个函数,它将字符串增加一个字符,例如:

'AAA' + 1 = 'AAB'
'AAZ' + 1 = 'ABA'
'ZZZ' + 1 = 'AAAA'

我已经为前两种情况实现了函数,但是对于第三种情况,我想不出任何解决方案。在

我的代码是:

^{pr2}$

有什么建议吗?在


Tags: 函数字符串代码情况解决方案字符建议zzz
3条回答

怎么样?在

def new_sku(s):
    s = s[::-1]
    already_added = False
    new_sku = str()

    for i in s:
        if not already_added:
            if (i < 'Z'):
                already_added = True
            new_sku += chr((ord(i)+1)%65%26 + 65)
        else:
            new_sku += i

    if not already_added: # carry still left?
        new_sku += 'A'

    return new_sku[::-1]

样品运行:-

^{pr2}$

如果您处理的是bijective numeration,那么您可能有(或应该有)函数来转换成/来自双射表示;只需将其转换为一个整数,增加它,然后再转换回原来的值就容易得多了:

def from_bijective(s, digits=string.ascii_uppercase):
    return sum(len(digits) ** i * (digits.index(c) + 1)
               for i, c in enumerate(reversed(s)))

def to_bijective(n, digits=string.ascii_uppercase):
    result = []
    while n > 0:
        n, mod = divmod(n - 1, len(digits))
        result += digits[mod]
    return ''.join(reversed(result))

def new_sku(s):
    return to_bijective(from_bijective(s) + 1)

你得想想“AAA”、“ZZZ”。。。作为您操作的值的表示。在

首先,解析值:

val = sum(pow(26, i) * (ord(v) - ord('A') + 1) for i, v in enumerate(value[::-1]))

然后,增加价值:

^{pr2}$

编辑

最终值由以下公式得出:

res = ""
while val > 0:
     val, n = divmod(val - 1, 26)
     res = chr(n+ord('A')) + res

缺少零的表示要求传递给divmod的值在每一个回合递减,我还没有找到一种处理列表理解的方法。在

编辑

可以使用string.ascii_uppercase.index()和{},而不是ord()和{}

相关问题 更多 >