2016-08-10 3 views
-3

성의 각 문자를 알파벳의 연속 문자로 대체하는 방법은 무엇입니까? 이 스크립트가 마스킹 도구로 필요합니다. 마지막 이름성별의 각 문자를 알파벳의 연속 문자로 바꿉니다.

로직 (B 로의 변경, B에서 C 변화, ...., A와 Z 변경)

예 : 홍길동해질 것이다 존 EPF

입력 파일 : names.txt

John yi 
kary Strong 
Joe Piazza 
So man 

답변

0

다음과 같이 해결 될 수 귀하의 질문에 정의 된 문제 : 다음

parts = name.split() 
parts[1]=''.join([chr((ord(c) - 65 + 1) % 26 + 65) 
        if ord(c) < 91 else 
        chr((ord(c) - 97 + 1) % 26 + 97) 
        for c in parts[1]]) 
' '.join(parts) 

, 나는 물론이 강한 가정이다, 문자열의 두 번째 단어로 성을 정의하지만에 대한 개선 이것은 질문의 주된 문제가 아닙니다.

문자를 이동하는 것은 목록 내에서 수행되며 각 문자는 별도로 처리되며 처음에는 ord을 사용하여 ASCII 코드로 변환됩니다. 대문자의 ASCII 코드는 65-90 (A - Z)이며 소문자 ASCII 코드는 97-122 (a - z)입니다. 따라서 조건을 분리하는 데 ord(c) < 91 조건이 사용됩니다. 그런 다음 각각의 경우에 ASCII 코드는 0-25 범위의 값으로 변환되고 (이 예제에서는 1 씩 증가됨) 모듈러 연산 % 26za으로 다시 변환하는 데 사용됩니다. 결과 값은 문자 ASCII 코드의 적절한 범위로 다시 변환됩니다.

+0

이렇게하면 z? – user357269

+0

아니요, 대문자와 소문자로 사용합니다. –

+0

이 코드는 문제를 해결하는 데 도움이 될 수 있지만 _why_ 및/또는 _how_는 질문에 대답하지 않습니다. 이러한 추가적인 컨텍스트를 제공하면 장기적인 가치가 크게 향상됩니다. 어떤 제한 사항 및 가정이 적용되는지를 포함하여 설명을 추가하기 위해 답을 [편집하십시오]. –

1

이것을 Caesar's cipher이라고합니다. 당신은 조금뿐만 아니라 대문자를 허용하도록 변경해야합니다 https://stackoverflow.com/a/8895517/6664393

: 하나에 의해 이동하는

def caesar(plaintext, shift): 
    alphabet_lower = string.ascii_lowercase 
    alphabet_upper = string.ascii_uppercase 
    alphabet = alphabet_lower + alphabet_upper 
    shifted_alphabet_lower = alphabet_lower[shift:] + alphabet_lower[:shift] 
    shifted_alphabet_upper = alphabet_upper[shift:] + alphabet_upper[:shift] 
    shifted_alphabet = shifted_alphabet_lower + shifted_alphabet_upper 
    table = string.maketrans(alphabet, shifted_alphabet) 
return plaintext.translate(table) 

사용 shift = 1

는 여기에 어떻게하는지 살펴 보자.

관련 문제