将字符串的所有字母加1

时间:2014-03-18 13:43:21

标签: python string python-3.x

当我输入"abc"时,我想将"bcd"作为输出。

所以我希望A BBC,依此类推Z A。 那么我该如何做到这一点我没有丝毫的线索。

5 个答案:

答案 0 :(得分:18)

您可以使用translate直接将字母更改为其他字母:

try:
    from string import makestrans
except ImportError:
    maketrans = str.maketrans

from string import ascii_lowercase

#old = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
#new = 'bcdefghijklmnopqrstuvwxyzaBCDEFGHIJKLMNOPQRSTUVWXYZA'

offset = 1

old_lower = ascii_lowercase
new_lower = old_lower[offset:] + old_lower[:offset]
old = old_lower + old_lower.upper()
new = new_lower + new_lower.upper()

# Create a translate table.
trans = maketrans(old, new)

# Translate your string using trans
print("abc".translate(trans))
# bcd

答案 1 :(得分:5)

您可以使用ord函数获取角色的代码点,然后将其递增1,将其转换回具有chr函数的角色。最后,使用str.join函数加入所有字符,就像这样

data = "abc"
print("".join(chr(ord(char) + 1) for char in data))
# bcd

z的特殊情况可以像这样处理

print("".join(chr(ord(char) + 1) if char != 'z' else 'a' for char in data))

答案 2 :(得分:3)

使用reduce:

astr = "abc"
print reduce(lambda r,x:r+chr(ord(x)+1),astr,"")

输出:

bcd

编辑:

对于角落案例:

 print reduce(lambda r,x:r+chr(ord(x)+1) if x != 'z' else r+'a',astr,"")

答案 3 :(得分:0)

编辑:以下代码仅适用于Python 2,在Python 3中,模块名为strprint是函数。

使用maketrans。以下是仅用于字母a-z,而不是A-Z,作为练习:

import string

lowercase_to = string.ascii_lowercase[1:] + string.ascii_lowercase[:1]  # bcdefg...xyza
translation = string.maketrans(string.ascii_lowercase, lowercase_to)

s = "abc"
print s.translate(translation)  # Prints "bcd"

答案 4 :(得分:0)

您可以使用python中的ord函数获取角色的代码点,然后使用chr将代码点转换回char。对于ASCII字符,字母的代码点是按字母顺序连续和顺序的,例如ord('a') + 1 == ord('b')等等。所以你可以做这样的事情(为了清楚起见,我们用长形式编写,但它可以很容易地缩短列表理解):

newstring = ""
for c in "abc":
    codepoint = ord(c)
    next_codepoint = codepoint + 1
    newstring += chr(codepoint)

这是基本情况,但您可能还需要处理从'z''a'的包装。如果char超出有效范围,您可能需要进行一些错误处理。你可以这样做:

newstring = ""
for c in "abc":
    if c == 'z':
        newstring += 'a'
    elif c == 'Z':
        newstring += 'A'
    else:
        codepoint = ord(c)
        if (ord('a') <= codepoint <= ord('z')) or (ord('A') <= codepoint <= ord('Z')):
            next_codepoint = codepoint + 1
            newstring += chr(codepoint)
        else:
            raise ValueError("Character %r is outside of the valid range." % c)