#python #dictionary #encryption
#python #словарь #шифрование
Вопрос:
Я пытаюсь практиковаться в использовании словарей и функций на python. Я пытаюсь написать программу, которая шифрует простую фразу или предложение с помощью зашифрованного алфавита:
Original alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Encrypted alphabet: TDLOFAGJKRICVPWUXYBEZQSNMH.
Пользователь должен ввести фразу или предложение для шифрования, чтобы оно могло содержать прописные или строчные буквы, пробелы, запятые и точки. Однако выходные данные должны содержать только заглавные буквы с пробелами и знаками препинания.
cipher ={"A":"T","a":"T","B":"D","b":"D","C":"L","c":"L","D":"O","d":"O","E":"F","e":"F","F":"A","f":"A","G":"G","g":"G","H":"J","h":"J","I":"K","i":"K","J":"R","j":"R","K":"I","k":"I","L":"C","l":"C","M":"V","m":"V","N":"P","n":"P","O":"W","o":"W","P":"U","p":"U","Q":"X","q":"X","R":"Y","r":"Y","S":"B","s":"B","T":"E","t":"E","U":"Z","u":"Z","V":"Q","v":"Q","W":"S","w":"S","X":"N","x":"N","Y":"M","y":"M","Z":"H","z":"H"}
def encode(str,cipher):
result=""
for c in str:
result = result cipher[c]
return result
Ответ №1:
Иногда лучше попросить прощения, чем разрешения. Вы можете удалить половину своего ключа: значения и заменить их на str.upper() , таким образом, маленькие буквы становятся большими буквами. Если вы вызываете dict().get(key), вы получаете значение ключа или не получаете его. Оператор or между dict и character вычисляется до символа, если cipher.get(character) возвращает None .
def get_chiper(plaintext):
cipher = {"A": "T", "B": "D", "C": "L", "D": "O", "E": "F",
"F": "A", "G": "G", "H": "J", "I": "K", "J": "R",
"K": "I", "L": "C", "M": "V", "N": "P", "O": "W",
"P": "U", "Q": "X", "R": "Y", "S": "B", "T": "E",
"U": "Z", "V": "Q", "W": "S", "X": "N", "Y": "M",
"Z": "H"}
return "".join(cipher.get(character.upper()) or character
for character in plaintext)
И полное кодирование и декодирование можно было бы выполнить с помощью той же функции, изменив dict .
def encode(plaintext, cipher):
return "".join(cipher.get(character.upper()) or character
for character in plaintext)
def decode(secret, encoding_cipher):
decode_cipher = {value: key for key, value in encoding_cipher.items()}
return encode(secret, decode_cipher)
def main():
cipher = {"A": "T", "B": "D", "C": "L", "D": "O", "E": "F",
"F": "A", "G": "G", "H": "J", "I": "K", "J": "R",
"K": "I", "L": "C", "M": "V", "N": "P", "O": "W",
"P": "U", "Q": "X", "R": "Y", "S": "B", "T": "E",
"U": "Z", "V": "Q", "W": "S", "X": "N", "Y": "M",
"Z": "H"}
plaintext = "hello foo from bar"
secret = encode(plaintext, cipher)
plaintext = decode(secret, cipher)
print(secret, plaintext)
if __name__ == '__main__':
main()
Ответ №2:
Вы должны исключить те случаи с неизвестными символами, и это может быть сделано с помощью:
cipher ={"A":"T","a":"T","B":"D","b":"D","C":"L","c":"L","D":"O","d":"O","E":"F","e":"F","F":"A","f":"A","G":"G","g":"G","H":"J","h":"J","I":"K","i":"K","J":"R","j":"R","K":"I","k":"I","L":"C","l":"C","M":"V","m":"V","N":"P","n":"P","O":"W","o":"W","P":"U","p":"U","Q":"X","q":"X","R":"Y","r":"Y","S":"B","s":"B","T":"E","t":"E","U":"Z","u":"Z","V":"Q","v":"Q","W":"S","w":"S","X":"N","x":"N","Y":"M","y":"M","Z":"H","z":"H"}
def encode(words, cipher):
result = ''
for letter in words:
if letter in cipher:
result = result cipher[letter]
else:
result = result letter
return result
phrase = raw_input('Please enter your phrase: ')
print encode(phrase, cipher)
Комментарии:
1. Спасибо за помощь! Есть ли более удобный способ сообщить пользователю ввести фразу, которую они хотят зашифровать? На данный момент я ввожу «encode («фраза», шифр). Но это не совсем интуитивно понятно. Идеи?
2. Привет, я отредактировал код, чтобы помочь вам в этом. Это решение использует синтаксис 2.x, поэтому я надеюсь, что вы используете то же самое.