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!'
只有部分字母被翻译,我无法解释原因。有人能说出这是为什么吗?
答案 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
默认为输入,如果没有找到)
在这种特殊情况下,使用codecs
和rot13
编码有一个更简单的解决方案:
import codecs
def decoder(s):
return codecs.encode(s,"rot13")