2017-10-22 6 views
1

본질적으로 입력을 가져 와서 해당 번호로 변환 한 다음 목록에서 "오프셋"에 입력 한 내용을 세어 새로운 대응 번호를 반환해야합니다.목록을 작성하십시오

예를 들어 "de"의 경우 "4", "5"로 변환 한 다음 "7", "8"까지 계산해야하며 프로그램에서 "gh"를 반환해야합니다.

실제로 목록을 위로 이동하는 방법을 파악하는 데 어려움을 겪고 있습니다. 이미 string 가져

import string 

translate = { 
'a': "1", 'b': "2", 'c': "3", 'd': "4", 'e': "5", 'f': "6", 
'g': "7", 'h': "8", 'i': "9", 'j': "10", 'k': "11", 'l': "12", 
'm': "13", 'n': "14", 'o': "15", 'p': "16", 'q': "17", 'r': "18", 
's': "19", 't': "20", 'u': "21", 'v': "22", 'w': "23", 'x': "24", 
'y': "25", 'z': "26", 
} 

msg = input("Enter Message: ") 
offset = input("Enter Offset: ") 
caesar = [translate[ch.lower()] for ch in msg if ch in string.ascii_letters] 
+2

* "목록을 위로 이동"*하는 것은 정확히 무엇을 의미합니까? 또한 문자열보다 정수로 오프셋을 더 쉽게 추가 할 수 있습니다. – jonrsharpe

+0

잘 이해하면 반전 된 사전을 만들고 그 사전의 가치를 살펴 봐야합니다. 예를 들어 'd'를 사용하면 4를 얻게되고 반전 된 사전에서 4 + 오프셋을 찾습니다. – prossellob

+0

누군가 "hi"라고 입력하면 해당 번호로 번역해야합니다 (이 부분은 잘 작동합니다). 그런 다음 "오프셋"에 입력 된 숫자를 계산하십시오. 그래서 그들이 3 : hi를 입력하면 "8", "9"로 변환되고 "11", "12"가되어야합니다. – white

답변

3

대신 수동으로 사전을 정의하고 오프셋 계산 string.ascii_letters로 색인 할 수 그렇게. z에서 A까지 모듈러를 사용하는 것을 잊지 마십시오.

import string 

msg = 'de' 
offset = 3 
caesar = ''.join(string.ascii_letters[(string.ascii_letters.index(ch) + offset) % len(string.ascii_letters)] 
       for ch in msg) 

print(caesar) 
# gh 

약간 더 읽을 수 있도록 확장 할 수 있습니다 :

msg = 'de' 
offset = 3 

caesar = [] 
for ch in msg: 
    ch_index = string.ascii_letters.index(ch) 
    new_index_with_offset = (ch_index + offset) % len(string.ascii_letters) 
    new_ch = string.ascii_letters[new_index_with_offset] 
    caesar.append(new_ch) 

caesar = ''.join(caesar) 

print(caesar) 
# gh 

나는 독자에게 연습으로 z (오히려 A 이상) a까지 포장 떠날거야.

+0

의 가능한 복제본 잘 ascii_lowercase를 사용하고이 부분을 감쌀 수 있습니다. 포장 문제를 해결하기 위해'(string.ascii_letters.index (ch) + offset')를 대괄호로 묶으십시오 (%는 +보다 우선 순위가 높음). – Nullman