早安,
我刚刚在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)
答案 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;长度。