2014-06-05 5 views
1

Travailler sur un simple programme de cryptographie (très simple, ridiculement faible) pour une mission, et il me semble être en cours d'exécution dans la même erreur quelle que soit la façon dont je vais parler.caractères dans une chaîne remplacement en Python

def cryptofied(text, dic): 
    for i, j in dic.items(): 
      text = text.replace(i, j) 
    return text 

EDIT: maintenant en utilisant def cryptofied (texte, dic): ret = "" pour p dans la gamme (LEN (texte)): ret + = dic [texte [p]] retour ret

Et

def encode(codedMsg): 
    print(codedMsg, ' Here was your message to be encoded.') 
    lock = {'A':'X', 'B':'P', 'C':'M', 'D':'G', 'E':'T', 'F':'D', 'G':'H', 'H':'L', 'I':'Y', 'J':'O', 'K':'N', 'L':'Z', 'M':'B', 'N':'W', 'O':'E', 'P':'A', 'Q':'R', 'R':'K', 'S':'J', 'T':'U', 'U':'F', 'V':'S', 'W':'C', 'X':'I', 'Y':'Q', 'Z':'V'} 
    codedMsgTest = cryptofied(codedMsg, lock) 
    print(codedMsgTest, 'here is your coded message') 

Cependant, quand je entrée, par exemple, "franc" comme codedMsg, il recracher à "GKXCC", ce qui est manifestement faux. D'après ce que je peux dire, le problème est qu'il change le "K" en "N", puis en changeant les deux instances de "N" en "C". Que puis-je faire pour l'éliminer? Donc, le problème avec ce code maintenant est que si un caractère est utilisé qui n'est pas dans mon verrou, une erreur revient. Comment puis-je ignorer ces personnages?

+1

Bienvenue dans StackOverflow! Merci pour cette excellente question - peu de nouveaux utilisateurs écrivent des questions aussi bonnes que celle-ci. C'est un plaisir de vous avoir ici et j'espère que vous apprécierez de contribuer à ce site à l'avenir. –

Répondre

5

Vous pouvez parcourir le mot avec des indices, puis les modifier les uns après les autres représenté ci-dessous:

for i in xrange(len(text)): 
    text[i] = dic[text[i]] 

mais there is a method called maketrans(), which allows you to do exactly this.

import string 
s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
s2 = "XPMGTDHLYONZBWEARKJUFSCIQV" 
trans = string.maketrans(s1,s2) 
strtrans = "THIS IS A SAMPLE PROGRAM FOR MAKETRANS" 
outstr = strtrans.translate(trans) 
print outstr  # ULYJ YJ X JXBAZT AKEHKXB DEK BXNTUKXWJ 
+0

utilisation' '' s1 = "" .join (lock.keys()) '' '' '' et s2 = "" .join ([verrouiller [l] pour l dans s1]) '' 'faire les chaînes de la' '' lock''' dict – wnnmaw

+0

ouais qui est un bon conseil wnnmaw ... – anirudh

+0

Je aime vraiment cette réponse, et je dirais qu'il est probablement le plus rapide à l'entrée , mais puisque j'ai déjà fait le travail pour l'autre, je pense que la suggestion de Pavel est probablement la plus utile pour cette instance –

1

c'est parce que text.replace(i, j) fonctionne sur tous correspond à i.

au lieu de itérer sur le dictionnaire

for i, j in dic.items(): 
     text = text.replace(i, j) 

vous devez itérer sur les positions du mot d'entrée

ret = "" 
for p in range(len(text)): 
     ret += dic[text[p]] 
return ret 
+0

grâce, fixes qui – Pavel

+0

Maintenant, '' 'ret + = dic [texte [p]]' '' doit être '' 'ret + = dic [texte [p] .upper()]' '' car seule supérieure les lettres minuscules sont en '' 'dic''' – wnnmaw

0

Vous pouvez itérer sur la chaîne elle-même:

>>> lock = {'A':'X', 'B':'P', 'C':'M', 'D':'G', 'E':'T', 'F':'D', 'G':'H', 'H':'L', 'I':'Y', 'J':'O', 'K':'N', 'L':'Z', 'M':'B', 'N':'W', 'O':'E', 'P':'A', 'Q':'R', 'R':'K', 'S':'J', 'T':'U', 'U':'F', 'V':'S', 'W':'C', 'X':'I', 'Y':'Q', 'Z':'V'} 
>>> text = "FRANK" 
>>> encrypted_text = "" 
>>> for char in text: 
...  encrypted_text += lock.get(char) 
... 
>>> encrypted_text 
'DKXWN' 
>>> 
Questions connexes