คีย์การพิมพ์และหากตรงตามเงื่อนไขค่าคีย์การพิมพ์

ฉันต้องการสร้างสคริปต์การเข้ารหัสอย่างง่าย

ฉันมีพจนานุกรมนี้:

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

หากคุณต้องการใช้ dict จริงๆ ซึ่งสำหรับ 'ตัวอักษร' แต่ละคีย์มีค่า 'ตัวอักษรตรงข้าม' :

นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้:

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) ของพจนานุกรม ซึ่งจะส่งคืน ไม่มี เมื่อคีย์ ไม่พบ 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)

ตอนนี้เรากำลังใช้ list comprehension เนื่องจากเราไม่ต้องการเงื่อนไขอีกต่อไป การเรียก diction.get(ch, ch) จะส่งคืน ch หรืออักขระที่เข้ารหัสที่เกี่ยวข้อง หรือส่งกลับค่า ch เองหากไม่พบในพจนานุกรม ด้วยการเรียก str.join() เช่น "".join(...) เราแปลงรายการกลับเป็นสตริง

person Baltasarq    schedule 15.10.2020