2013-11-10 48 views
0

我想比較字符串char char長度爲thisline。 但是,我得到超出範圍錯誤。是否因爲Index,其落入-1或£#$½$#£我知道它的存在,但... IndexError:列表索引超出範圍

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 

回答

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如果在thisline作爲p僅具有5個字符多於5個元素。

它會更容易,如果你使用的zip()reversed()for循環:

thisline = i.split() 
for a, b in reversed(zip(thisline, p)): 
    print(v(a, b)) 

現在你保證不會碰到索引問題。

1

不要忘記你的進口:

import string 
import collections 

現在哪裏見過此代碼之前... :)

相關問題