由于某些原因,在我的代码中没有经过-当我打印出'newnum'时,超出范围的数字的newnumber不是它应该是什么。有人知道问题出在哪里吗?
letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
numbers = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
zipped = dict(zip(letters, numbers))
zipped2 = dict(zip(numbers, letters))
punc = [',','.','!','?','!', ' ']
def decode(codeword, x):
numbercode = []
for letters in codeword:
if letters not in punc:
numbercode.append(zipped[letters])
newnum = []
for num in numbercode:
newnum.append(num+x)
lettercode = []
for num in newnum:
if num+x >= 25:
num = num+x-26
lettercode.append(zipped2[num])
lettercode = ' '.join(lettercode)
return lettercode
decode('tiger', 11)
对于这种用法,您应该使用模运算%
。
如果您不想这样做,代码中的问题是您通过再次添加x
来进行比较。你应该比较x>25
和分配num=num-26
。
所以解决方案是:
def decode(codeword, x):
numbercode = []
for letter in codeword:
if letter not in punc:
numbercode.append(zipped[letter])
newnum = []
for num in numbercode:
newnum.append(num + x)
lettercode = []
for num in newnum:
if num > 25:
num = num - 26
lettercode.append(zipped2[num])
lettercode = "".join(lettercode)
return lettercode
使用模运算的解为:
def decode(codeword, x):
numbercode = []
for letter in codeword:
if letter not in punc:
numbercode.append(zipped[letter])
newnum = []
for num in numbercode:
newnum.append(num + x)
lettercode = []
for num in newnum:
lettercode.append(zipped2[num % 26])
lettercode = "".join(lettercode)
return lettercode
最后,一个简短的代码版本可以完成,因为你在每个循环中更新列表的项,而不需要所有这些循环:
def decode_short(codeword, x):
lettercode = []
for letter in codeword:
if letter not in punc:
lettercode.append(zipped2[(zipped[letter] + x) % 26])
return "".join(lettercode)
用列表推导式甚至更短:
def decode_very_short(codeword, x):
return "".join([zipped2[(zipped[l] + x) % 26] for l in codeword if l not in punc])