Распечатать ключ и, если условие выполнено, распечатать значение ключа

Я хотел бы создать простой скрипт кодирования.

У меня есть этот словарь:

diction =  {
"A" :  "Z", 
"Y" :  "B",
"C" :  "X"
}

Я хочу дать какое-то случайное предложение, перебрать его буквы и, если буква найдена в этом словаре, вывести букву напротив
Итак, если я поставлю слово

"ABC"

он должен вернуться:

"ZYX"

Я пробовал этот код, но у меня KeyError :

# Defining dictionary
diction =  {
"A" :  "Z", 
"Y" :  "B",
"C" :  "X",
"W" :  "E",
"E" :  "V",
"U" :  "F",
"G" :  "T",
"S" :  "H",
"I" :  "R",
"Q" :  "J",
"K" :  "P",
"O" :  "L",
"M" :  "N",
" " :  " "
}

# Sentence in "szyfr" variable should be split into list.

szyfr = "SOME SENTENCE WHATEVER"

def split(szyfr): 
     return [char for char in szyfr]

szyfr = split(szyfr)


# Now I want to iterate through "szyfr" and replace letters as in "CAT" example:  

for i in szyfr:
        if i in diction:
                
                diction = {x:y for x,y in diction.items()}
                print(i)
                print("Variable: " + i + " is in 'key'")
                pass
        elif diction[i] in szyfr:
                diction = {y:x for x,y in diction.items()}
                print(i)
                print("Variable: " + i + " is in 'value'")
        elif i is " ":
                pass

print(szyfr)


person Irka Irenka    schedule 15.10.2020    source источник
comment
Почему в своем цикле вы меняете diction?   -  person khelwood    schedule 15.10.2020


Ответы (3)


Вам не хватает некоторых букв, например N. Обратите внимание, что {"M": "N"} — это не то же самое, что {"N": "M"}.

При этом вам даже не нужен словарь, как если бы вы вычли код ASCII из заглавная буква (например, 65 для A) из 155 (65+65+26-1) вы получите код ASCII соответствующей буквы:

>>> szyfr = "SOME SENTENCE WHATEVER"
>>> "".join(chr(155-ord(e)) if "A" <= e <= "Z" else e for e in szyfr)
'HLNV HVMGVMXV DSZGVEVI'
person Selcuk    schedule 15.10.2020

Если вы действительно хотите использовать словарь, в котором для каждой клавиши «буква» имеет значение «противоположная буква»:

Это возможное решение:

diction = {" ": " "}

all_letters = range(ord('A'), ord('Z')+1)
for char, opsite_char in zip(all_letters, reversed(all_letters)):
    diction[chr(char)] = chr(opsite_char)

print(diction)

ВЫХОДЫ:

{' ': ' ', 'A': 'Z', 'B': 'Y', 'C': 'X', 'D': 'W', 'E': 'V', 'F': 'U', 'G': 'T', 
'H': 'S', 'I': 'R', 'J': 'Q', 'K': 'P', 'L': 'O', 'M': 'N', 'N': 'M', 'O': 'L', 
'P': 'K', 'Q': 'J', 'R': 'I', 'S': 'H', 'T': 'G', 'U': 'F', 'V': 'E', 'W': 'D', 
'X': 'C', 'Y': 'B', 'Z': 'A'}
person Pixel_teK    schedule 15.10.2020
comment
Более простой способ: import string; d = dict(zip(string.ascii_uppercase, reversed(string.ascii_uppercase))) - person Selcuk; 15.10.2020
comment
Верно, но я подумал, что, показав взаимосвязь между их ASCII, это может помочь ему понять, что вопрос даже не требует создания словаря. Если проблема этого не требует. - person Pixel_teK; 15.10.2020

Следуя приведенному вами коду, я нахожу следующие странности:

szyfr = "SOME SENTENCE WHATEVER"

def split(szyfr): 
     return [char for char in szyfr]

szyfr = split(szyfr)

Кажется, вы пытаетесь создать список из строки символов, что можно просто сделать так:

>>> s = "hola"
>>> l1 = list(s)
>>> l1
['h', 'o', 'l', 'a']

Итак, в вашем конкретном случае:

szyfr = "SOME SENTENCE WHATEVER"
szyfr = list(szyfr)

Хотя на самом деле это не нужно, так как вы можете напрямую управлять строкой, как если бы это был список, с помощью for.

Теперь вы хотите заменить символы, следующие за определенным словарем. Я считаю ваше решение слишком сложным, а вам нужно только:

diction =  {
"A" :  "Z", 
"Y" :  "B",
"C" :  "X",
"W" :  "E",
"E" :  "V",
"U" :  "F",
"G" :  "T",
"S" :  "H",
"I" :  "R",
"Q" :  "J",
"K" :  "P",
"O" :  "L",
"M" :  "N",
" " :  " "
}

sentence_to_code = input("Give me a sentence: ").strip().upper()
toret = ""

for ch in sentence_to_code:
    coded_ch = diction.get(ch)

    if not coded_ch:
        coded_ch = ch

    toret += coded_ch

print(toret)

Если вы не определяете соответствия всем возможным символам, разумно использовать метод словаря get(k), который возвращает None, когда ключ k не найден.

Необходимо учитывать, что метод get(k) имеет параметр по умолчанию для возвращаемого значения в случае, если ключ не найден, поэтому вы можете использовать get(k, default_return_value), что позволяет еще больше упростить код:

diction =  {
"A" :  "Z", 
"Y" :  "B",
"C" :  "X",
"W" :  "E",
"E" :  "V",
"U" :  "F",
"G" :  "T",
"S" :  "H",
"I" :  "R",
"Q" :  "J",
"K" :  "P",
"O" :  "L",
"M" :  "N",
" " :  " "
}

sentence_to_code = input("Give me a sentence: ").strip().upper()
toret = "".join([diction.get(ch, ch) for ch in sentence_to_code])

print(toret)

Теперь мы используем понимание списка, так как нам больше не нужно условное выражение. Вызов diction.get(ch, ch) возвращает ch или соответствующий закодированный символ, или сам ch, если он не найден в словаре. При вызове str.join(), т. е. "".join(...) преобразуем список обратно в строку.

person Baltasarq    schedule 15.10.2020