Python中替换列表项的数学公式问题



由于某些原因,在我的代码中没有经过-当我打印出'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])

最新更新