Kunci cetak dan jika kondisi terpenuhi nilai kunci cetak

Saya ingin membuat skrip pengkodean sederhana.

Saya punya kamus ini:

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

Saya ingin memberikan beberapa kalimat acak, mengulangi huruf-hurufnya dan jika huruf ditemukan dalam kamus ini - cetak huruf yang berlawanan
Jadi, Jika saya memasukkan kata

"ABC"

itu harus kembali:

"ZYX"

Saya mencoba kode ini, tetapi saya memiliki 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 sumber
comment
Mengapa di loop Anda Anda mengubah diction?   -  person khelwood    schedule 15.10.2020


Jawaban (3)


Anda kehilangan beberapa huruf, seperti N. Perhatikan bahwa {"M": "N"} tidak sama dengan {"N": "M"}.

Meskipun demikian, Anda bahkan tidak memerlukan kamus seolah-olah Anda mengurangi kode ASCII dari huruf besar (seperti 65 untuk A) dari 155 (65+65+26-1) Anda akan mendapatkan kode ASCII dari huruf yang bersangkutan:

>>> 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

Jika Anda benar-benar ingin menggunakan dict yang setiap kunci 'huruf' memiliki nilai 'huruf berlawanan' :

Ini adalah solusi yang mungkin:

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)

KELUARAN :

{' ': ' ', '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
Cara yang lebih mudah: import string; d = dict(zip(string.ascii_uppercase, reversed(string.ascii_uppercase))) - person Selcuk; 15.10.2020
comment
Benar, tapi saya pikir dengan menunjukkan hubungan antara ASCII mereka, itu mungkin membantunya menyadari bahwa pertanyaan itu bahkan tidak memerlukan pembuatan dict. Jika masalahnya tidak menuntutnya. - person Pixel_teK; 15.10.2020

Mengikuti kode yang Anda berikan, saya menemukan keanehan berikut:

szyfr = "SOME SENTENCE WHATEVER"

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

szyfr = split(szyfr)

Tampaknya Anda mencoba membuat daftar dari string karakter, yang dapat dilakukan dengan mudah sebagai:

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

Jadi, dalam kasus spesifik Anda:

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

Meskipun demikian, hal ini tidak terlalu diperlukan, karena Anda dapat langsung mengelola string seolah-olah itu adalah sebuah daftar, dengan untuk.

Sekarang, Anda ingin mengganti karakter yang mengikuti kamus tertentu. Menurut saya solusi Anda terlalu rumit, sementara Anda hanya perlu:

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)

Jika Anda tidak mendefinisikan koresponden untuk semua karakter yang mungkin, maka masuk akal untuk menggunakan metode kamus get(k), yang mengembalikan Tidak Ada ketika kunci k tidak ditemukan.

Harus diingat bahwa metode get(k) memiliki parameter default untuk nilai yang dikembalikan jika kunci tidak ditemukan, sehingga Anda dapat menggunakan get(k, default_return_value), yang memungkinkan kita menyederhanakan kode lebih jauh lagi:

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)

Sekarang kita menggunakan pemahaman daftar, karena kita tidak memerlukan kondisi lagi. Panggilan diction.get(ch, ch) mengembalikan ch atau karakter berkode terkait, atau ch sendiri jika tidak ditemukan dalam kamus. Dengan panggilan ke str.join(), yaitu "".join(...) kita mengubah daftar kembali menjadi sebuah string.

person Baltasarq    schedule 15.10.2020