如何用循环基于第一个列表筛选第二个列表的所有匹配元素(禁用set)
列表匹配问题解决
原代码错误原因
- 遍历
listX过程中调用remove()删除元素,会导致列表索引动态变化,被删除元素的下一个元素会直接跳过遍历,造成漏匹配 - 原有逻辑限制了
list2中每个值的保留次数等于该值在list1中的出现次数,和你需要的「只要值存在就保留所有对应元素」的需求不符
循环实现方案(无set)
方案1:基础双层循环实现
直接遍历list2的每个元素,判断该元素是否存在于list1中,存在则加入结果列表,完全基于循环实现:
list1 = [1, 2, 2, 3, 3, 4] list2 = [1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5] list3 = [] for num in list2: exist = False # 内层循环判断当前元素是否在list1中存在 for val in list1: if num == val: exist = True break if exist: list3.append(num) print(list3) # 输出结果:[1, 1, 2, 2, 3, 3, 4, 4, 4]
方案2:优化性能版(先对list1去重)
如果list1数据量较大,可以先通过循环对list1去重,减少后续判断的遍历次数:
list1 = [1, 2, 2, 3, 3, 4] list2 = [1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5] list3 = [] # 循环对list1去重,不使用set unique_list1 = [] for val in list1: if val not in unique_list1: unique_list1.append(val) for num in list2: exist = False for val in unique_list1: if num == val: exist = True break if exist: list3.append(num)
补充:按重复次数取交集的场景
如果你后续有「list1中某值出现N次,list2中该值最多保留N次」的需求,也可以用以下循环实现:
list1 = [1, 2, 2, 3, 3, 4] list2 = [1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5] count_map = {} list3 = [] # 循环统计list1各元素出现次数 for val in list1: if val in count_map: count_map[val] += 1 else: count_map[val] = 1 for num in list2: if num in count_map and count_map[num] > 0: list3.append(num) count_map[num] -= 1 print(list3) # 输出结果:[1, 2, 2, 3, 3, 4]
内容的提问来源于stack exchange,提问作者Viki Liu
相关产品推荐
相关产品推荐

