0

我正在尝试通过将每个字母替换为前面两个位置的字母来修改字符串。例如,将“a”替换为“c”,将“b”替换为“d”。唯一的例外是“y”应该被“a”替换,“z”应该被“b”替换(循环回到开始)。

我已经为它编写了以下代码,这似乎可以达到目的,但是输出格式会破坏它。

string = "g fmnc wms bgblr rpylqjyrc gr zw fylb."
print string
for i in string:
    if i.isalpha():
        if ord(i)>120:
            print chr(ord(i)-24),
        else:
            print chr(ord(i)+2),
    else: 
        print i

输出 :

g fmnc wms bgblr rpylqjyrc gr zw fylb.
i   h o p e   y o u   d i d n t   t r a n s l a t e   i t   b y   h a n d .

预期输出:

g fmnc wms bgblr rpylqjyrc gr zw fylb.
i hope you didnt translate it by hand.

有没有其他更快的方法来解决这个问题?

4

3 回答 3

3

print i,语法在正在打印的内容的末尾添加了一个空格。您可以通过将所有字符放在一个列表中并''.join()在最后对它们进行 ing 来解决此问题:

string = "g fmnc wms bgblr rpylqjyrc gr zw fylb."
print string
answer = []
for i in string:
    if i.isalpha():
        if ord(i)>120:
            answer.append(chr(ord(i)-24))
        else:
            answer.append(chr(ord(i)+2))
    else: 
        answer.append(i)
print ''.join(answer)

当然,正如其他人所建议的那样,string.translate可能会更直接

于 2013-07-23T00:19:20.893 回答
1

这是使用 string.translate 的解决方案:

from string import translate, maketrans, ascii_lowercase

s='g fmnc wms bgblr rpylqjyrc gr zw fylb.'

rot2=maketrans(
    ascii_lowercase,
    ascii_lowercase[2:]+ascii_lowercase[:2]
    )

print s.translate(rot2)
于 2013-07-23T00:48:21.537 回答
0

您还可以使用列表理解的这种可怕的混蛋。

message = "g fmnc wms bgblr rpylqjyrc gr zw fylb."
print message
print ' '.join([''.join([chr(((ord(letter)+2) % 122) + int(ord(letter)/121.0)*96) if ord(letter)>96 else letter for letter in word]) for word in message.split()])
于 2013-07-23T00:42:42.037 回答