循环中依据另一列表删除列表元素时报list index out of range错误如何修复
错误原因
- 引用赋值导致列表同时被修改:
stock2 = stock属于Python的引用赋值,两个变量指向内存中的同一个列表,你调用stock2.remove()时本质是在同步修改原stock列表的内容。 - 循环范围预计算导致下标越界:
range(len(stock))是在循环启动前一次性计算的,初始stock长度为3,所以循环会依次取i=0、1、2,但循环过程中你把stock的元素删到只剩1个,当i取大于0的值时,访问stock[i]自然会触发下标越界错误。 - 额外冗余问题:你当前的逻辑会重复匹配同一个元素,内层循环每判断一次就尝试删除一次,会带来不必要的性能损耗。
修复方案
推荐优先用列表推导式实现需求,逻辑简洁且不会出现越界问题:
check_list = ['a', 'aaafa', 'bbb', 'agaa'] stock = ['f', 'g', 'z'] # 提前把check_list元素统一转大写,避免循环中重复转换 check_upper = [s.upper() for s in check_list] # 直接生成过滤后的新列表:保留stock中不在check_list里的元素 stock2 = [item for item in stock if not any(item.upper() in s for s in check_upper)] print(stock2)
如果要保留你原本的循环写法,可调整为遍历元素而非下标、单独拷贝列表避免联动修改:
check_list = ['a', 'aaafa', 'bbb', 'agaa'] stock = ['f', 'g', 'z'] # 用copy()生成独立的新列表,修改stock2不会影响原stock stock2 = stock.copy() check_upper = [s.upper() for s in check_list] # 直接遍历原stock的元素,不用下标自然不会越界 for item in stock: item_upper = item.upper() for s in check_upper: if item_upper in s: if item in stock2: stock2.remove(item) # 匹配到一次就跳出内层循环,避免重复判断 break print(stock2)
两种方案运行后输出均为['z'],符合你的预期。
内容的提问来源于stack exchange,提问作者Lolo
相关产品推荐
相关产品推荐

