初学者在python中的indexerror

时间:2017-08-03 12:37:51

标签: python index-error

我自己已经找到了解决方案,也许我什么也没发现,或者我甚至无法识别正确的解决方案。

我已经为一门课程完成了这个作业并且代码可以工作但是当我将它放入代码测试器(课程所需)时,我收到以下消息:

merge([4])期望[4]但在第16行收到(Exception:IndexError)“list index out of range”,在合并中

如何摆脱这个错误? 顺便说一句,这是尝试创建游戏'2048',其中非零数字必须向左移动,而相同的数字将组合起来产生两倍的值。

2 0 2 4应该变成4 4 0 0

这是我的代码:

    def merge(line):
        """
        Function that merges a single row or column in 2048.
        """
        new_list = line
        for x in line:
            if x == 0:
                line.remove(0)
                line.append(0)
        if new_list[0] == new_list[1]:
            new_list[0] = new_list[0] * 2
            new_list.pop(1)
            new_list.append(0)
        else:
            pass
        if new_list[1] == new_list[2]:
            new_list[1] = new_list[1] * 2
            new_list.pop(2)
            new_list.append(0)
        else:
            pass
        if new_list[2] == new_list[3]:
            new_list[2] = new_list[2] * 2
            new_list.pop(3)
            new_list.append(0)
        else:
            pass
        return new_list
        return []

    #test
    print '2, 0, 2, 4 becomes', merge([2, 0, 2, 4])

2 个答案:

答案 0 :(得分:0)

如果问题是这行代码:

if new_list[1] == new_list[2]:

我想这是一个问题,因为你使用过的测试仪。更具体地说,它甚至在错误的输入上测试你的代码,比如一个空数组。因此,您可以尝试在输入上插入一些控件,如下一个:

if len(line) === 0: # it checks if the array is empty

此外,根据16num的建议,我建议你删除return [],因为这行代码无法访问。

答案 1 :(得分:0)

如果代码有效并且您只想处理可以通过使用try和except来完成的错误。

这里是一个例子,其中merge()被调用三次,第二次调用它没有足够的数字使函数工作,这会触发一个IndexError,然后传递给它代码可以继续运行。

def merge(line):
#Function that merges a single row or column in 2048.
    try:
        new_list = line
        for x in line:
            if x == 0:
                line.remove(0)
                line.append(0)
        if new_list[0] == new_list[1]:
            new_list[0] = new_list[0] * 2
            new_list.pop(1)
            new_list.append(0)
        else:
            pass
        if new_list[1] == new_list[2]:
            new_list[1] = new_list[1] * 2
            new_list.pop(2)
            new_list.append(0)
        else:
            pass
        if new_list[2] == new_list[3]:
            new_list[2] = new_list[2] * 2
            new_list.pop(3)
            new_list.append(0)
        else:
            pass
        return new_list
        return []
    except IndexError:
        #print('index error')
        pass


#test
print('2, 0, 2, 4 becomes', merge([2, 0, 2, 4]))
print('2, 0, 2 triggers an index error, which is passed and the code keeps running', merge([2, 0, 2]))
print('2, 0, 2, 4 becomes', merge([2, 0, 2, 4]))