对比两个列表元素,删除list1中首元素不在list2内的子项的实现方法
过滤列表的实现方法
核心需求为保留list1中首元素存在于list2中的子项。多数循环写法出错的原因是正序遍历原列表时直接删除元素,删除操作会让列表长度变短、后续元素索引前移,导致部分元素被跳过漏判。
1. 列表推导式(最简洁,推荐)
先把list2转成集合可将in查询的时间复杂度从O(n)降到O(1),数据量大时性能提升明显:
# 补全原列表语法缺失的逗号 list1 = [[1, 0.5], [2, 0.8], [3, 0.9], [4, 0.8], [5, 0.7]] list2 = [1, 2, 5] filter_set = set(list2) result = [item for item in list1 if item[0] in filter_set] print(result) # 输出:[[1, 0.5], [2, 0.8], [5, 0.7]]
2. 显式for循环实现
如果需要写完整循环逻辑,建议新建空列表存储符合条件的元素,避免修改原列表导致的索引问题:
filter_set = set(list2) result = [] for item in list1: if item[0] in filter_set: result.append(item)
3. 原列表上修改的写法
如果必须直接修改原list1而不是生成新列表,需要倒序遍历索引:
filter_set = set(list2) # 从最后一个索引往前遍历,删除元素不会影响未遍历的索引位置 for i in range(len(list1)-1, -1, -1): if list1[i][0] not in filter_set: del list1[i] # 此时list1就是过滤后的结果
内容的提问来源于stack exchange,提问作者WieWie
相关产品推荐
相关产品推荐

