如何实现凯撒密码

时间:2012-11-04 07:03:32

标签: python

  

可能重复:
  Caesar’s Cipher using python, could use a little help

好吧,所以在我的班上,我应该编写将字典转换为Ceasar密码的代码。我的代码将所有内容都移动得很好,但是按照与提供的测试用例不同的顺序返回密钥。

我的代码:

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

for c in dCode.keys():

    if c in sUpperCase:

        if sUpperCase.index(c) + shift > 25:

            dCode[c] = sUpperCase[(sUpperCase.index(c) + shift) - 26]

        else:

            dCode[c] = sUpperCase[(sUpperCase.index(c) + shift)]

    if c in sLowerCase:

        if sLowerCase.index(c) + shift > 25:

            dCode[c] = sLowerCase[(sLowerCase.index(c) + shift) - 26]

        else:

            dCode[c] = sLowerCase[(sLowerCase.index(c) + shift)]

return dCode

我的buildCoder输出(0)(最容易阅读)

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

他们的输出:

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

我已经使用python进行测试和比较,它们确实是由相同的键组成的词:值。任何建议都会很棒。 (这是一个在线麻省理工学院的课程。通常有论坛,但是在有考试的情况下它们会关闭。这不适用于考试,

2 个答案:

答案 0 :(得分:3)

Python中的字典不保留特定的顺序。因此,您无法确定按照(a)最初创建的顺序或(b)最后更新的顺序读取键和值。

很明显,这两本词典是相同的。

编辑:dict1 == dict2足以证明两个词典是否相同;你不必分段检查每个键/值。

答案 1 :(得分:1)

另外请注意,您应该使用模数%运算符而不是- 26

替换

    if sUpperCase.index(c) + shift > 25:

        dCode[c] = sUpperCase[(sUpperCase.index(c) + shift) - 26]

    else:

        dCode[c] = sUpperCase[(sUpperCase.index(c) + shift)]

使用

    dCode[c] = sUpperCase[(sUpperCase.index(c) + shift) % 26]