我希望将char字符串char与thisline
的长度进行比较。
但是,我正在超出范围错误。是因为Index
,它落入-1或£#$½$#£
def vigsquare(printable=False):
'''
Returns a string like a vigenere square,
printable joins each row with a newline so it's literally square
printable=False (defaul) joins without newlines for easier
searching by row and column index
'''
alpha = string.ascii_uppercase
rotater = collections.deque(alpha)
vigsquare_list = []
for i in range(26):
vigsquare_list.append(''.join(rotater))
rotater.rotate(-1)
if printable:
return '\n'.join(vigsquare_list)
else:
return ''.join(vigsquare_list)
def v(row, column):
'''
Return a character from a vigenere square by
row and column letter.
vigenere('L', 'G') returns 'R'
'''
alpha = string.ascii_uppercase
rowindex = alpha.find(row)
columnindex = alpha.find(column)
return vigsquare()[rowindex*26 + columnindex]
p = "LEMON"
Kasiski = open("c:\\HobbitStory.txt","r")
lines = Kasiski.readlines()
for i in lines:
thisline = i.split()
Index = len(thisline)
while (Index>=0):
print(v(thisline[Index],p[Index]))
Index -= 1
答案 0 :(得分:4)
您将Index
设置为行的长度;但索引转到len() - 1
,因为Python使用基于0的索引。
减1:
thisline = i.split()
Index = len(thisline) - 1
while Index >= 0:
print(v(thisline[Index], p[Index]))
Index -= 1
如果IndexError
中的元素数超过5个,那么仍会抛出thisline
,因为p
只有5个字符。
使用zip()
,reversed()
和for
循环会更容易:
thisline = i.split()
for a, b in reversed(zip(thisline, p)):
print(v(a, b))
现在您可以保证不会遇到索引问题。
答案 1 :(得分:1)
不要忘记你的进口:
import string
import collections
现在我在哪里看到这段代码......:)