2014-06-05 32 views
1

为一个赋值工作一个简单的(非常简单,可笑的)加密程序,而且我似乎会遇到同样的错误,不管我以哪种方式去处理它。替换字符串中的字符在Python中

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

编辑:现在使用 DEF cryptofied(文本,DIC): RET = “” 对于p在范围(LEN(文本)): RET + = DIC [文本[P]] 返回RET

而且

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

然而,当我输入,例如, “坦诚” 为codedMsg,它会吐回 “GKXCC”,这显然是不正确。据我所知,问题在于它将“K”改为“N”,然后将两个“N”改为“C”。我能做些什么来消除这种情况?

编辑: 所以,现在这个代码的问题是,如果使用的字符不在我的锁中,则会返回错误。我怎样才能忽略这些角色?

+1

欢迎来到StackOverflow!谢谢你提出的一个很好的问题 - 没有多少新用户写这个问题。很高兴有你在这里,我希望你在未来能够为这个网站贡献力量。 –

回答

5

你可以用索引遍历这个单词,然后一个接一个地修改它们如下所示:

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

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

使用'''s1 =“”.join(lock.keys())'''''''s2 =“”.join([lock [l] for l在's1])'''从''''lock''字典中输入字符串 – wnnmaw

+0

是的,这是一个很棒的提示wnnmaw ... – anirudh

+0

我真的很喜欢这个答案,我会说这可能是最快的输入,但由于我已经为另一个人完成了这项工作,我认为Pavel的建议可能对这个实例最有用 –

1

这是因为text.replace(i, j)运行在全部匹配的i

,而不是遍历字典

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

您需要遍历在输入字的位置

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

谢谢,修正了 – Pavel

+0

现在'''ret + = dic [text [p]]''''需要是'''ret + = dic [text [p] .upper()]'''大写字母在'''dic'''中 – wnnmaw

0

可以遍历字符串本身:

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