2017-02-08 1 views
4

문자열의 각 문자 (암호문)를 주어진 숫자 (시프트)만큼 알파벳을 통해 더 이동시키는 코드를 작성해야합니다. 그것은 거의 어떤 일이 일어나고 것은 코드가 암호를 통해 실행, 그것은 어떤 문자를 변경하는 것입니다 제외하고, 작동문자열의 문자 변경

def decode(cipher, shift): 
     letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
     for letter in cipher: 
      index = letters.index(letter) 
      cipher = cipher.replace(letter, letters[index-shift]) 
     return cipher 
    print decode("LIPPSASVPH", 4) 

: 지금까지 작성한 코드는 (기능을 테스트하는 예제) 다음과 같다 이는 현재 변경중인 것과 일치합니다. 예를 들어, "HELLOWORLD"를 반환 하겠지만 암호의 마지막 문자가 H이고 코드가 이전에 암호의 시작 부분에서 L을 변경했기 때문에 대신 "DELLOWORLD"를 반환합니다 H이면 코드가 H를 D로 변경합니다. 다른 문자도 변경하지 않고 각 문자를 개별적으로 실행하는 방법에 대한 제안 사항은 무엇입니까? 모두들 고마워요.

답변

1

당신은 결과를 저장하고

def decode(cipher, shift): 
    letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    result = '' 
    for letter in cipher: 
     index = letters.index(letter) 
     result += letters[index - shift] 
     # cipher = cipher.replace(letter, letters[index - shift]) 
    return result 
print decode("LIPPSASVPH", 4) 
+0

감사합니다,이 트릭 않았다! 빈 문자열을 만드는 것과 비슷한 것을 시도했지만, 주석을 달고 결과를 넣으십시오. + 그 다음에는 코드가 실행되는 방식에 대해 이해가되지 않습니다. 어쨌든, 다시 한번 감사드립니다! –

+0

당신은 환영합니다 :) – thangtn

1

대신 장소에서 암호를 변경하는 결과를 저장하기 위해 새로운 변수를 만들 수 있습니다 반환하는 새 변수를 사용할 수 있습니다.

def decode(cipher, shift): 
    result = "" 
    letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    for letter in cipher: 
     index = letters.index(letter) 
     #cipher = cipher.replace(letter, letters[index-shift]) 
     result += letters[index-shift] 
return result 
print (decode("LIPPSASVPH", 4)) 
1

str.replace을 사용할 때 문자열의 모든 L, D 등을 교체하고 : 이런 식으로 뭔가 트릭을 할 것입니다. 다음과 같이 시도해 볼 수 있습니다.

기본적으로 해당 코드 글자를 찾아 목록에 추가합니다. 마지막으로 ''.join()을 사용하여 정렬 된 목록 요소를 문자열로 바꿉니다.

결과 :

>>> decode("LIPPSASVPH", 4) 
'HELLOWORLD' 

편집 :

>>> letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
>>> cipher = 'LIPPSASVPH' 
>>> shift = 4 
>>> new_cipher = ''.join(letters[letters.index(letter)-shift] for letter in cipher) 
0

귀하의 코드가 잘 문자열을 수정할 것으로 보인다 : 여기에 한 줄 (물론, 새로운-암호 생성이가)입니다. 대안은 문자열을 목록으로 변환하고 그런 식으로 요소를 수정하는 것입니다. 디버깅을 단순화하기 위해 함수를 조금 더 복잡하게하는 데 도움이 될 수 있습니다.

x = "Hello" 
y = list(x) 
# y is now ['H', 'e', 'l', 'l', 'o'] 
y[1] = 'i' 
# y is now ['H', 'i', 'l', 'l', 'o'] 
x = str(y) 
0

다른 변수가 제안한 것처럼 결과를 새로운 변수로 만들 수 있지만 본능은 완전히 다른 접근 방식을 취하는 것입니다. 나는 암호문의 매핑이 해독 translate()를 사용하여 다음 maketrans()에 일반 텍스트,하고 만들 것 :

>>> from string import maketrans 
>>> 
>>> def decode(cipher, shift): 
...  letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
...  shift = shift % len(letters) 
...  mapping = maketrans(letters[shift:] + letters[:shift], letters) 
...  return cipher.translate(mapping) 
... 
>>> print decode("LIPPSASVPH", 4) 
HELLOWORLD