繁体   English   中英

IndexError:超出函数的Python列表索引

[英]IndexError: list index out of range in Python for function

我尝试在此站点上查找,但我找不到我的程序到底出了什么问题。 它一直到13或data_list [25],但随后吐出该IndexError消息。

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)

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[25 + 1]不存在, data_list[n + 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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM