2013-07-23 2 views
0

Я пытаюсь изменить строку, заменив каждый алфавит алфавитом, который находится на два положения впереди. например 'a' заменено на 'c', 'b' заменено на 'd'. Единственными исключениями являются «y», которые должны быть заменены на «a» и «z» на «b» (цикл возвращается к началу).String Manipulation 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 = "АБВГДЕЖЗИКЛМНОПРСТУФХЧШЭЮЯ" 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)