我正在尝试编写一个代码,最终将使用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的值?
答案 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