2013-07-23 59 views
0

我試圖修改一個字符串,通過替換每個字母表的前面兩個位置的字母表。例如'a'替換爲'c','b'替換爲'd'。唯一的例外是'y'應該被'a'和'z'替換爲'b'(循環返回開始)。字符串操作Python

我已經爲它寫了下面的代碼,它似乎達到了目的,但輸出格式化會損壞它。

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. 

是否有任何替代,更快捷的方法來解決這個問題?

+6

'從字符串進口translate'並使用它。 – dansalmo

+0

感謝做了以下作爲一種替代方法'intab = 「ABCDEFGHIJKLMNOPQRSTUVWXYZ」 outtab = 「cdefghijklmnopqrstuvwxyzab」 trantab = maketrans(intab,outtab) 打印string.translate(trantab)' – misguided

+0

cs50x?真正好的課程:) –

回答

3

print i,語法在正在打印的東西的末尾添加一個空格。您可以通過把所有的字符在列表和''.join()荷蘭國際集團他們到底解決這個問題:

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將可能是更爲直接的

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()]) 
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)