我是初学程序员,遇到了一个我无法解决的问题。我正在创建一个程序,通过将每个字母的序数值依次添加到文本中每个字母的序数值来加密文本,并使用chr()函数打印新字符。
codeword = input('Enter codeword : ')
encrypt = input('Enter text to encrypt : ')
j = 0
for i in encrypt:
check = (ord(encrypt[j])+ ord(codeword[j])-96)
if check > 122:
no = check - 26
ok = (chr(no))
ok = ok.replace("%", " ")
print(ok, end="")
if check < 122:
yes = (chr(check))
yes = yes.replace("%", " ")
print(yes, end="")
j+=1
当我选择abc作为代码字而嘿作为要加密的单词时,它工作正常并打印igb。但是,如果我选择abc作为代码字和hello world作为要加密的单词,我会收到以下消息。
Traceback (most recent call last):
File "C:/Python34/task 2.py", line 9, in <module>
check = (ord(encrypt[j])+ ord(codeword[j])-96)
IndexError: string index out of range
答案 0 :(得分:0)
由于encrypt
超过codeword
,因此您可以覆盖索引5
。 encrypt[5]
为,但
codeword[5]
不存在。你需要找到最短的一个:
for e, c in zip(encrypt, codeword):
check = (ord(e) + ord(c) - 96)
...
您也可以使用min()
功能:
for j in range(min(len(encrypt), len(codeword))):
...
修改:您似乎希望循环播放。您可以使用itertools
执行该任务:
from itertools import cycle
for e, c in zip(encrypt, cycle(codeword)):
...
cycle()
将永远迭代一个对象。当它到达终点时,它会回到开头。例如:
for char in cycle("here"):
print(char)
h
e
r
e
h
e
r
e
h
...
由于zip()
只能达到最短的可迭代次数,因此它只会循环到encrypt
的长度。例如:
for e, c in zip("this sentence", cycle("abc")):
print(e, c)
t a
h b
i c
s a
b
s c
e a
n b
t c
e a
n b
c c
e a
如果encrypt
短于codeword
:
for e, c in zip("hi", cycle("abc")):
print(e, c)
h a
i b
编辑2 :您希望将空格保留为空格。你可以这样做:
for e, c in zip(encrypt, cycle(codeword)):
if e == " ":
check = ord(e)
else:
check = (ord(e) + ord(c) - 96)
...