2013-07-23 3 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 = outtab = "cdefghijklmnopqrstuvwxyzab" trantab = maketrans (intab, outtab) 인쇄 string.translate (trantab) "ABCDEFGHIJKLMNOPQRSTUVWXYZ"' – 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)