2017-03-18 3 views
2

Ich versuche, die letzte Zeile in diesem Code zu verstehen - ich weiß, dass es den entsprechenden Klartext-Zeichen in encdic (Verschlüsselungswörterbuch und verbindet alles zusammen, um eine verschlüsselte Nachricht zu erstellen. Was ist der Code l.lower tun (unter obere Zeichen und es zu senken Umwandlung Wenn alle Zeichen bereits Kleinbuchstaben sind - wie verkürzen ich die letzte ZeileNotwendigkeit, Funktion zu verkürzen

return s.join(encdic.get(c.lower(), c) for c in plaintext) 
plaintext = "hhis is a fairly long piece of plainhexh fourscore and seven" 
d = 'gikaclmnqrpoxzybdefijstuvw' #decryption key 
encdic = dict(zip(alphabet, d)) #create decryption dictionary 
decdic = dict(zip(d, alphabet)) #create decryption dictionary 

def encrypt(plaintext, d): 
    s="" 
    return s.join(encdic.get(c.lower(), c) for c in plaintext) 

Wenn ich den Code zu verkürzen:

return s.join(encdic.get(c) for c in plaintext) 

ich das bekommen Folgefehler

TypeError: sequence item 4: expected str instance, NoneType found 

Wie kann ich das beheben?

Update:

return s.join(encdic.get(c,c) for c in plaintext) 

scheint ohne Fehler zu arbeiten, aber warum:

ich den Code geändert haben?

+0

1) Sind Sie sicher, dass 'c' immer klein geschrieben ist? 2) Sind Sie sicher, dass "c" immer ein Schlüssel in "encdic" ist? Wenn nicht, müssen Sie das längere Formular verwenden, das sicherstellt, dass der Schlüssel in Kleinbuchstaben geschrieben ist, und einen Standardwert zurückgibt, wenn der Schlüssel nicht im Wörterbuch gefunden wird. – Craig

+0

Danke - es iteriert durch den Klartext jedes Zeichen nachschlagen und eine verschlüsselte Nachricht erstellen - alles Klartext ist Kleinbuchstabe für Sue - Warum funktioniert mein angepasster Code (da Wörterbuch ist gezippt? Dh sieht aus wie 'a: g', ' s: f ': etc, da gibt es einen zweiten Parameter? – chrischris

+0

Der Typ Fehler bedeutet, dass einer der Dictionary Lookups fehlschlägt und '.get()' gibt einen Wert von 'None' zurück. Sind Sie sicher, dass Sie keinen haben? Nicht-Alpha-Zeichen in 'Klartext 'wie ein Leerzeichen? – Craig

Antwort

2

Sie Schlüssel hat i zweimal und fehlt ein h

Daten:

d = 'gikaclmnqrpoxzybdefijstuvw' # decryption key 

Testcode:

Ergebnisse:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 
+0

danke ein Haufen - fand es auch durch rohe Gewalt (dh durchschauen - hatte zwei "i" s und kein "h. Froh, dass ich htis Website gefunden habe - sehr zu schätzen all die Hilfe, die ich habe -zwei viel Zeit auf diese - Sorry so ein Neuling zu sein – chrischris

0

Die Methode get() ist wie folgt definiert:

dict.get(key, default=None) 

Da die gegebene Taste c ist keine Rückkehr bedeutet dies der Schlüssel c nicht zur Verfügung.

Sie erwähnten dies funktioniert: return s.join(encdic.get(c,c) for c in plaintext) Der Grund dafür ist, weil, wenn 'c' nicht als Schlüssel gefunden wird, ein Standardwert c zurückgegeben wird. Nimm an, dass das Alphabet 'abcdefghijklmnopqrstuvwxyz' ist, die einzige Zeit, die c nicht gefunden wird, ist, wenn es ein Leerzeichen ist. Daher wird dieser Whitespace-Charakter nicht verschlüsselt.

Zuvor return s.join(encdic.get(c) for c in plaintext), wenn c Leerzeichen ist, wird dies kein gültiger Schlüssel sein, da Ihre Schlüssel nur aus dem Alphabet a-z bestehen. Hier

ist ein funktionierendes Beispiel:

alphabet = 'abcdefghijklmnopqrstuvwxyz' 
plaintext = "hhis is a fairly long piece of plainhexh fourscore and seven" 
d = 'gikaclmnqrpoxzybdefijstuvw' #decryption key 
encdic = dict(zip(alphabet, d)) #create decryption dictionary 
decdic = dict(zip(d, alphabet)) #create decryption dictionary 

def encrypt(plaintext): 
    return "".join(encdic.get(c, c) for c in plaintext) 
def decrypt(encrypted_text): 
    return "".join(decdic.get(c, c) for c in encrypted_text) 

encrypted_text = encrypt(plaintext) 
decrypted_text = decrypt(encrypted_text) 
print("plaintext:", plaintext + '\n' 
    "encrypted_text:", encrypted_text + '\n' 
    "decrypted_text:", decrypted_text + '\n') 
0

Hier ist eine Lösung, die für mich funktioniert.

alphabet = 'abcdefghijklmnopqrstuvwxyz ' #space added to end 
d = 'gikaclmnqrpoxzybdefijstuvw '  #space added to end 

encdic = dict(zip(alphabet,d)) 
decdic = dict(zip(d,alphabet)) 

def encrypt(plaintext): #note, I removed d since it isn't used 
    s="" 
    return s.join(encdic.get(c) for c in plaintext) 

def decrypt(encrypted): #note, I removed d since it isn't used 
    s="" 
    return s.join(encdic.get(c) for c in encrypted) 

Ich bin in der Lage, die verschlüsselte Zeichenfolge und die entschlüsselte Zeichenfolge mit diesem Code zu erhalten.Der Fehler könnte in der Definition von alphabet liegen oder Sie könnten eine Zeichenfolge zum Entschlüsseln übergeben, die den Buchstaben h enthält, da dieser fehlt d, so dass Sie nicht entschlüsseln und verschlüsselte Zeichenfolge, wenn es das Zeichen "h" enthält.

Verwandte Themen