Python在for循环内删除列表元素触发ValueError的解决办法
问题原因
- [2,6]是
nk列表中的元素,且该元素存在于nQ列表中,因此满足if n in nQ的判断条件,触发print(n)输出了该值。 - 报错的核心原因是代码没有判断
n是否存在于positions列表中,直接调用positions.remove(n),当n不在positions中时就会抛出ValueError: list.remove(x): x not in list。你观察到的“删除最后一个元素时报错”只是场景巧合,本质和元素位置无关,只要遍历到的n在nQ中但不在positions中就会触发报错。 - 如果你原本的
positions是nk的副本,那之前的remove操作已经修改了positions的元素和长度,导致和nk的元素不再对齐,后续遍历nk拿到的元素自然可能不在positions里。
修复方案
遍历列表的同时调用remove修改列表是非常容易出问题的写法,更稳妥高效的方式是直接生成过滤后的新列表:
- 先将
nQ的元素转成元组构建集合,解决列表不可哈希的问题,同时将in查询的时间复杂度从O(n)降到O(1) - 用列表推导式直接生成过滤后的结果,完全避免
remove报错
示例代码:
# 构建nQ的元组集合用于快速查询 nQ_set = set(tuple(item) for item in nQ) # 过滤掉nk中存在于nQ里的元素 filtered_nk = [n for n in nk if tuple(n) not in nQ_set] # 如果需要修改positions列表,直接赋值即可 positions = [n for n in positions if tuple(n) not in nQ_set]
如果你的业务逻辑必须保留原循环写法,可以在调用remove前加一层存在性判断,不过该方案效率较低,仅做兼容参考:
print(positions) for n in nk: if n in nQ: print(n) if n in positions: positions.remove(n) print(positions)
内容的提问来源于stack exchange,提问作者Raul V
相关产品推荐
相关产品推荐

