通过for循环改变后打印出整个字典(Python)

时间:2013-12-02 18:13:53

标签: python dictionary

我正在尝试编写一个代码,最终将使用Caesar密码对文本进行加密。在这部分中,我试图创建(对于任何班次)一个新的字典,将原始字母映射到移位的字母(其中大写 - >大写和小写 - >小写,标点符号,数字和空格保持不变。)

在下面的代码中,我从一个字典开始,将所有字母(大写和小写)映射到它们自己,然后根据移位改变它:

def buildCoder(shift):
    """
    Returns a dict that can apply a Caesar cipher to a letter.
    The cipher is defined by the shift value. Ignores non-letter characters
    like punctuation, numbers, and spaces.

    shift: 0 <= int < 26
    returns: dict
    """
    import string
    mydict = {'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'} 
    newdict = {}
    for value in mydict:
        if value in string.ascii_uppercase:
            valIndex = string.ascii_uppercase.find(value)
            newVal = string.ascii_uppercase[((valIndex + shift) % 26)]
            newdict.update({str(value):str(newVal)})
            return newdict
        elif value in string.ascii_lowercase:
            valIndex = string.ascii_lowercase.find(value)
            newVal = string.ascii_lowercase[((valIndex + shift) % 26)]
            newdict.update({str(value):str(newVal)})
            return newdict
    return newdict

但我的输出看起来像这样:

buildCoder(3)
Out[7]: {'B': 'E'}

如何让程序打印整个移位词典?为什么只打印B的值?

3 个答案:

答案 0 :(得分:1)

def buildCoder(shift):    
    idx = shift % 26
    mapping = dict(zip(ascii_lowercase,ascii_lowercase[idx:] + ascii_lowercase));
    mapping.update(dict(zip(ascii_uppercase,ascii_uppercase[idx:] + ascii_uppercase)))
    return mapping

更清洁

答案 1 :(得分:0)

你只是在第一个字母转换然后返回字典,那就是当程序退出你的功能时。你不需要那个return语句:

import string

def buildCoder(shift):
mydict = {'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 value in mydict:
    if value in string.ascii_uppercase:
        valIndex = string.ascii_uppercase.find(value)
        newVal = string.ascii_uppercase[((valIndex + shift) % 26)]
        newdict[value] = newVal
    elif value in string.ascii_lowercase:
        valIndex = string.ascii_lowercase.find(value)
        newVal = string.ascii_lowercase[((valIndex + shift) % 26)]
        newdict[value] = newVal
return newdict

另外,看看如何在python中更新dict中的vales,它更容易阅读。

答案 2 :(得分:0)

没试过这个,但它应该有效。这是回报。

def buildCoder(shift):
    """
    Returns a dict that can apply a Caesar cipher to a letter.
    The cipher is defined by the shift value. Ignores non-letter characters
    like punctuation, numbers, and spaces.

    shift: 0 <= int < 26
    returns: dict
    """
    import string
    mydict = {'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'} 
    newdict = {}
    for value in mydict:
        if value in string.ascii_uppercase:
            valIndex = string.ascii_uppercase.find(value)
            newVal = string.ascii_uppercase[((valIndex + shift) % 26)]
            newdict.update({str(value):str(newVal)})
        elif value in string.ascii_lowercase:
            valIndex = string.ascii_lowercase.find(value)
            newVal = string.ascii_lowercase[((valIndex + shift) % 26)]
            newdict.update({str(value):str(newVal)})
    return newdict