IndexError:带有for循环的“pop index超出范围”

时间:2016-10-19 11:42:51

标签: python

早安, 我刚刚在python中编写了这个程序,这个IndexError不断出现。我不知道如何解决它,我甚至尝试使用while循环但没有改变...我希望有人可以帮我解决这个问题!

这是我的代码,它应该检查两个列表(la,lb)的对象的长度,并且:如果字符串的长度小于lb字符串,则从la列表中删除字符串,反之亦然。必须删除两个字符串,如果它们的长度相同。

def change(l1,l2):
    la1 = l1[:]
    la2 = l2[:]
    i = 0
    for i in range(len(la1)): 
        if la1[i] == la2[i]:
            l1.pop(i)
            l2.pop(i)
        elif la1[i] > la2[i]:
            l2.pop(i)
        elif la2[i] > la1[i]:
            l1.pop(i)

3 个答案:

答案 0 :(得分:2)

假设您的列表长度相同

正如评论中指出的,IndexError由于您的列表而发生了#{1}}。 pop()项目时长度的变化。

由于您使用range(len(l))循环中的for对您的列表进行迭代,并且在每个完成的循环后都没有更新,因此您最终会点击索引超出范围。

一个例子,您可以自己轻松地尝试:

l = [1,2,3,4,5,6,7,8,9,10]

for i in range(len(l)):
    l.pop(i)
    print("Length of list", len(l))

不要在for循环中调用print(range(len(l))来混淆自己 - 这会给你一个更新的范围,但是会产生误导。 for循环中的range只被调用一次,因此在迭代时永远不会更新。

另一种方法

不要使用索引,而是尝试使用zip()并构建新列表,而不是更改现有列表。

def change(l1, l2):
    new_l1 = []
    new_l2 = []
    for a, b in zip(l1, l2):
        if len(a) == len(b):
            continue # do nothing
        elif len(a)<len(b):
            new_l2.append(b)
        elif len(a)>len(b):
            new_l1.append(a)
    return new_l1, new_l2

这种方法基本上使用pop()生成您创建的相同列表,同时避免使用索引。

请注意,zip()一旦到达两个迭代中较小的一个的末尾就会停止。如果您的列表长度可能不同,并且您希望迭代直到两个迭代中的最长迭代完全迭代,请使用zip_longest()。但我不认为这是你在这种情况下所需要的。

附加说明

如果您使用以下代码迭代list,也会遇到问题:

l = [i for i in range(10)]
for item in l:
    l.remove(item)
>>>[1, 3, 5, 7, 9]

基本上, 不建议在更改任何iterable时进行迭代 。这可能导致从Exception被抛出到无声的意外行为。

我知道你通过循环复制来避免这种情况,我只是想为后代添加它。

答案 1 :(得分:1)

如果你想遍历一个列表并想清空它
但不希望弹出索引错误使用这个:

lst = [ 1, 4, 56, 2, 4 , 12,  6, 89 ,11, 0]
i =0
while len(lst) != 0:
    lst.pop(0)
    i+=1
print(lst)

答案 2 :(得分:0)

您可以向后遍历列表,这样当您从列表中删除项目时,您尚未检查的元素的索引不会受到影响

def f(a, b):
    l = len(a) if len(a)<len(b) else len(b)
    for i in range(l):
        j = l-i-1
        la, lb = len(a[j]), len(b[j])
        if la<lb: a.pop(j)
        elif lb<la: b.pop(j)
        else: a.pop(j), b.pop(j)
    return a, b

ps我坚持忠实于你的问题陈述而不是你的实施,而是基于字符串&#39;长度。