2016-11-29 1 views
-1

Ich habe gestern eine Aufgabe über Rot bekommen und mir wurde gesagt, ich schreibe alle 26 davon in Code, oder zumindest ein Programm, das tat, also dachte ich, ich würde mit dem Wörterbuch anfangen Ich wollte auch eine gewisse Fäulnis einfordern.Mein ASCII-Wert-Wörterbuch funktioniert nicht

def generate_rotated_dictionary(n): 
    for i in range(0, 26): 
     letter = alphabet_list[i] 
     new_let = ord(letter) + n 
     new_let = chr(new_let) 
     rot_dic.update({letter: new_let}) 
    return(rot_dic) 

Leider ist dies nicht funktioniert und die Ergebnisse in:

{'a': 'b', 'c': 'd', 'b': 'c', 'e': 'f', 'd': 'e', 'g': 'h', 'f': 'g', 'i': 
'j', 'h': 'i', 'k': 'l', 'j': 'k', 'm': 'n', 'l': 'm', 'o': 'p', 'n': 'o', 
'q': 'r', 'p': 'q', 's': 't', 'r': 's', 'u': 'v', 't': 'u', 'w': 'x', 'v': 
'w', 'y': 'z', 'x': 'y', 'z': '{'} 

{'a': 'c', 'c': 'e', 'b': 'd', 'e': 'g', 'd': 'f', 'g': 'i', 'f': 'h', 'i': 
'k', 'h': 'j', 'k': 'm', 'j': 'l', 'm': 'o', 'l': 'n', 'o': 'q', 'n': 'p', 
'q': 's', 'p': 'r', 's': 'u', 'r': 't', 'u': 'w', 't': 'v', 'w': 'y', 'v': 
'x', 'y': 'z', 'x': 'z', 'z': '|'} 

{'a': 'd', 'c': 'f', 'b': 'e', 'e': 'h', 'd': 'g', 'g': 'j', 'f': 'i', 'i': 
'l', 'h': 'k', 'k': 'n', 'j': 'm', 'm': 'p', 'l': 'o', 'o': 'r', 'n': 'q', 
'q': 't', 'p': 's', 's': 'v', 'r': 'u', 'u': 'x', 't': 'w', 'w': 'z', 'v': 
'y', 'y': '|', 'x': 'z', 'z': '}'} 

{'a': 'e', 'c': 'g', 'b': 'f', 'e': 'i', 'd': 'h', 'g': 'k', 'f': 'j', 'i': 
'm', 'h': 'l', 'k': 'o', 'j': 'n', 'm': 'q', 'l': 'p', 'o': 's', 'n': 'r', 
'q': 'u', 'p': 't', 's': 'w', 'r': 'v', 'u': 'y', 't': 'x', 'w': 'z', 'v': 
'z', 'y': '}', 'x': '|', 'z': '~'} 

Wie kann ich es beheben mit dem Ende, ich weiß, dass es wegen meiner Verwendung von Ascii-Werte ist, aber wie Ich bekomme das mit dem ein wieder zu starten (Nummer 97)

+1

Was ist 'ro t'? Was bedeutet "nicht funktioniert"? Wie unterscheidet sich die Ausgabe von dem, was Sie wollen? –

+0

"Ich wurde aufgefordert, alle 26 von ihnen in Code zu schreiben," Alle 26 was? Bitte seien Sie genauer und detaillierter, damit wir Ihnen helfen können. –

+0

Vermutlich spricht er über die [rot13] (https://en.wikipedia.org/wiki/ROT13) Chiffre und ihre 25 anderen Varianten. – Kevin

Antwort

-2

Kaum eine volle Antwort wert, aber Sie möchten den Modulo 26 von new_let nehmen, bevor Sie in ein Zeichen konvertieren. durch Division mit Rest tun, erhalten Sie, wie weit letzten 26 der Index

Betrachten gegangen ist:

>>>26 + 13 # rot13 for z 
39 
>>>39 % 26 
13 
+0

downvote ohne Kommentar oder Vorschlag bearbeiten .........? – Aaron

0
l = list('abcdefghijklmnopqrstuvwxyz') 

n = 1 
rot = dict((c, chr(97 + ((ord(c)-97 + n)%26))) for c in l) 

Das Verständnis ist, ein wenig dicht, so geht es um Folgendes:

(c, chr(97 + ((ord(c)-97 + n)%26))) 

erzeugt Tupel eines Zeichens und sein verschobenes Gegenstück

chr(97 + ((ord(c)-97 + n)%26)) 

macht ein Zeichen

97 + (ord(c)-97 + n)%26 

den Wert des alten Charakter erhalten und berechnen, wie viele verschieben über.

+1

'l = map (chr, range (97,122))' –

3

Also, wenn Sie benötigen Alphabet drehen Sie folgende Methode verwenden:

import string 
alph = string.ascii_lowercase 
for i in range(26): 
    print(''.join([alph[(k + i) % 26] for k in range(26)])) 

Ausgang sind alphabetische Zeichenkette mit Offset:

abcdefghijklmnopqrstuvwxyz 
bcdefghijklmnopqrstuvwxyza 
cdefghijklmnopqrstuvwxyzab 
defghijklmnopqrstuvwxyzabc 
..... 
zabcdefghijklmnopqrstuvwxy 

Wenn Sie Listen anstelle von Strings müssen nur join() entfernen. Wenn Sie einige spezifische Drehung wie 13 erforderlich, dann können Sie diesen Code in Funktion mit dem Argument verwenden:

def rot(i): 
    return ''.join([alph[(k + i) % 26] for k in range(26)]) 

Dies wird Rotation für bestimmte Nummer. Beispiel:

print(rot(13)) 

Ausgang:

nopqrstuvwxyzabcdefghijklm 
+0

Vielen Dank. – Bart

0

um also zusammenzufassen, hier ist eine vollständige Methode:

# Generates a function which rotate a sequence by an offset 
def generate_rot(seq, offset): 
    l = len(seq) 
    def rot(c): 
     n = (seq.index(c) + offset) % l 
     return seq[n] 
    return rot 

> alpha = map(chr,range(97, 123)) # [a...z] 
> rot13 = generate_rot(alpha, 13) 
> print(rot13('a')) 
n 
> print(rot13('n')) 
a 
> rot21 = generate_rot(alpha, 21) 
v 

Sie dann, um das Alphabet binden kann, und zwar:

> def generate_alpha_rot(x): 
    return generate_rot(map(chr,range(97, 123)),x) 
# or using a lambda function to create it inline, because why not? 
> generate_alpha_rot = lambda x:generate_rot(map(chr,range(97, 123)),x) 
> rot22 = generate_alpha_rot(22) 
> rot22('a') 
w 
# Or call it inline: 
> generate_alpha_rot(23)('a') 
x