2015-10-21 139 views
0

我试着在这个网站上看,但我找不到我的程序到底出了什么问题。它一直到13或data_list [25],但它会吐出IndexError消息。IndexError:列表索引超出功能的Python范围

def rlEncode(n, z, data_list): 
    while data_list[n] == data_list[n+1]: 
     z = z + 1 
     n = n + 1 
    while data_list[n] != data_list[n+1]: 
     return (n, z) 

def unitTest(): 
    counter = 0 
    n = 0 
    z = 1 
    data_list = [1,1,1,1,1,3,3,5,5,5,5,5,5,6,8,8,1,1,1,5,5,5,5,13,14, 14] 
    compress_list = [ ] 
    while counter < len(data_list): 
     rlEncode(n, z, data_list) 
     x, y = rlEncode(n, z, data_list) 
     compress = [data_list[x], y] 
     counter = counter + 1 
     compress_list = compress_list + compress 
     n = x+1 
     z = 1 
     continue 
    print("list: ", data_list) 
    print("compressed: ", compress_list) 
+0

如果显示结果回溯这将有助于 –

回答

1

在你rlEncode功能,你递增n过高后检查while条件:

def rlEncode(n, z, data_list): 
    while data_list[n] == data_list[n+1]: 
     z = z + 1 
     n = n + 1 

第一次检查data_list[n] == data_list[n + 1]它的确定......但那么你就n = n + 1,去回去检查while的情况。此时,如果n是25,则data_list[n + 1]会给您一个索引错误,因为data_list[25 + 1]不存在。

您可以通过在n = n + 1之后添加打印线print(n, len(data_list))来检查此问题。

所以,无论是确保你只能从0迭代到24,或者确保你做这样的事情:

if n == len(data_list) - 1: 
    break 

你总是要保持你的阵列的上界记住,当你正在做的事情一样list[n + 1]算法中的任何地方。


剧透:以下解决方案:

为了让你的代码的工作,我做了两个变化:

def rlEncode(n, z, data_list): 
    # Make sure we don't overrun our list length: 
    while n < len(data_list) - 1 and data_list[n] == data_list[n + 1]: 
     z += 1 
     n += 1 
    return (n, z) 

def unitTest(): 
    counter = 0 
    n = 0 
    z = 1 
    data_list = [1,1,1,1,1,3,3,5,5,5,5,5,5,6,8,8,1,1,1,5,5,5,5,13,14,14] 
    compress_list = [] 
    while n < len(data_list) - 1: # Use n here, not counter 
     rlEncode(n, z, data_list) 
     x, y = rlEncode(n, z, data_list) 
     compress = [data_list[x], y] 
     counter = counter + 1 
     compress_list = compress_list + compress 
     n = x + 1 
     z = 1 
    print("list: ", data_list) 
    print("compressed: ", compress_list) 

unitTest() 

('list: ', [1,1,1,1,1, 3,3, 5,5,5,5,5,5, 6, 8,8, 1,1,1, 5,5,5,5, 13, 14,14])
('compressed: ', [1,5, 3,2, 5,6, 6,1, 8,2, 1,3, 5,4, 13,1, 14,2])

相关问题