Python删除列表中存在于另一列表的元素后仍存在如何解决
代码问题原因及修复方案
核心问题
- 你在通过
for循环遍历list_creatures_BP的同时,调用remove方法修改了列表的长度。Python的for循环遍历列表时是按索引顺序递进的,当你删除某一位置的元素后,该位置后续的所有元素都会自动向前移动一位补位,下一轮循环会直接跳过刚刚前移到当前索引位的元素,最终导致部分符合删除条件的元素没有被检测处理。 - 额外的效率缺陷:直接用
item in list_bosses_BP做成员判断,列表的成员查询时间复杂度为O(n),如果两个列表数据量较大,运行效率会非常低。
修复方案
推荐使用列表推导式生成过滤后的新列表,完全避免遍历过程修改原列表的问题,同时将boss列表转成集合优化查询效率:
# 先将boss列表转成集合,成员查询时间复杂度降到O(1) boss_set = set(list_bosses_BP) # 直接生成过滤后的生物列表 list_creatures_BP = [item for item in list_creatures_BP if item not in boss_set]
如果业务要求必须修改原列表而非生成新列表,可以反向遍历索引处理:
boss_set = set(list_bosses_BP) # 从最后一个索引向前遍历,删除元素不会影响未遍历的索引位置 for i in range(len(list_creatures_BP) - 1, -1, -1): if list_creatures_BP[i] in boss_set: del list_creatures_BP[i]
内容的提问来源于stack exchange,提问作者exec85
相关产品推荐
相关产品推荐

