我知道它存在但是... IndexError:列表索引超出范围

时间:2013-11-10 00:54:12

标签: python indexing comparison

我希望将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

2 个答案:

答案 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

现在我在哪里看到这段代码......:)