使用带字符串替换方法的字典

时间:2017-03-12 12:36:10

标签: python string dictionary

def decoder(message):
    key = {'a':'n', 'b':'o', 'c':'p', 'd':'q', 'e':'r', 'f':'s', 'g':'t', 'h':'u', 
   'i':'v', 'j':'w', 'k':'x', 'l':'y', 'm':'z', 'n':'a', 'o':'b', 'p':'c', 
   'q':'d', 'r':'e', 's':'f', 't':'g', 'u':'h', 'v':'i', 'w':'j', 'x':'k',
   'y':'l', 'z':'m', 'A':'N', 'B':'O', 'C':'P', 'D':'Q', 'E':'R', 'F':'S', 
   'G':'T', 'H':'U', 'I':'V', 'J':'W', 'K':'X', 'L':'Y', 'M':'Z', 'N':'A', 
   'O':'B', 'P':'C', 'Q':'D', 'R':'E', 'S':'F', 'T':'G', 'U':'H', 'V':'I', 
   'W':'J', 'X':'K', 'Y':'L', 'Z':'M'} 
    for i in message:
        for x,y in key.items():
            if i == y:
                message = message.replace(y,x)
   return message

>>>decoder('Pnrfne pvcure? V zhpu cersre Pnrfne fnynq!')
'Carsar piphrr? I mhph prrsrr Carsar salad!'

只有部分字母被翻译,我无法解释原因。有人能说出这是为什么吗?

2 个答案:

答案 0 :(得分:1)

你要多次更换东西。我想:

preg_split('/(\\d+)|(\D)/', $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

可能是你想要的(打印def decoder(message): key = {'a': 'n', 'b': 'o', 'c': 'p', 'd': 'q', 'e': 'r', 'f': 's', 'g': 't', 'h': 'u', 'i': 'v', 'j': 'w', 'k': 'x', 'l': 'y', 'm': 'z', 'n': 'a', 'o': 'b', 'p': 'c', 'q': 'd', 'r': 'e', 's': 'f', 't': 'g', 'u': 'h', 'v': 'i', 'w': 'j', 'x': 'k', 'y': 'l', 'z': 'm', 'A': 'N', 'B': 'O', 'C': 'P', 'D': 'Q', 'E': 'R', 'F': 'S', 'G': 'T', 'H': 'U', 'I': 'V', 'J': 'W', 'K': 'X', 'L': 'Y', 'M': 'Z', 'N': 'A', 'O': 'B', 'P': 'C', 'Q': 'D', 'R': 'E', 'S': 'F', 'T': 'G', 'U': 'H', 'V': 'I', 'W': 'J', 'X': 'K', 'Y': 'L', 'Z': 'M'} return ''.join(key[s] if s in key else s for s in message) print(decoder('Pnrfne pvcure? V zhpu cersre Pnrfne fnynq!')) )。

答案 1 :(得分:1)

更好地更改(或重建)字典以适合str.translate方法(需要字母的ascii代码作为键),仅为此完成:

key = {'a':'n', 'b':'o', 'c':'p', 'd':'q', 'e':'r', 'f':'s', 'g':'t', 'h':'u',
   'i':'v', 'j':'w', 'k':'x', 'l':'y', 'm':'z', 'n':'a', 'o':'b', 'p':'c',
   'q':'d', 'r':'e', 's':'f', 't':'g', 'u':'h', 'v':'i', 'w':'j', 'x':'k',
   'y':'l', 'z':'m', 'A':'N', 'B':'O', 'C':'P', 'D':'Q', 'E':'R', 'F':'S',
   'G':'T', 'H':'U', 'I':'V', 'J':'W', 'K':'X', 'L':'Y', 'M':'Z', 'N':'A',
   'O':'B', 'P':'C', 'Q':'D', 'R':'E', 'S':'F', 'T':'G', 'U':'H', 'V':'I',
   'W':'J', 'X':'K', 'Y':'L', 'Z':'M'}

# we can rebuild it like that
newkey = {ord(k):v for k,v in key.items()}

def decoder(s):
    return s.translate(newkey)

print( decoder('Pnrfne pvcure? V zhpu cersre Pnrfne fnynq!') )

结果:

Caesar cipher? I much prefer Caesar salad!

不在字典中的所有字符都保持原样。

没有它的下一个最简单的事情是:"".join([key.get(i,i) for i in s])

(使用dict.get默认为输入,如果没有找到)

在这种特殊情况下,使用codecsrot13编码有一个更简单的解决方案:

import codecs
def decoder(s):
    return codecs.encode(s,"rot13")