假设你的列表长度相等
正如评论中指出的那样,IndexError
发生这种情况是因为您的列表长度发生了变化pop()
一个物品。
由于您正在使用迭代列表range(len(l))
in a 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))
不要通过打电话来迷惑自己print(range(len(l))
在 for 循环中 - 这将为您提供更新的范围,但会产生误导。这range
for 循环中仅调用一次,因此在迭代时永远不会更新。
不同的方法
不要使用索引,而是尝试使用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
被抛出,以沉默的意外行为。
我知道您通过循环复制副本来避免这种情况,我只是想为后代添加它。