Python实现两个独立列表的共有值查找与非共有元素提取
问题目标
给定两个独立列表,完成以下操作得到新列表:
- 查找同时存在于两个列表中的公共元素
- 将这些公共元素从两个原列表中分别移除
- 汇总两个列表过滤后剩余的所有元素,生成最终结果列表
示例
输入
a = [ "DJI_0229.jpg", "DJI_0232.jpg", "DJI_0233.jpg", "DJI_0235.jpg" ] b = [ "DJI_0229.jpg", "DJI_0232.jpg", "DJI_0233.jpg", "DJI_0230.jpg", "DJI_0231.jpg", "DJI_0234.jpg" ]
期望输出
[ "DJI_0230.jpg", "DJI_0231.jpg", "DJI_0234.jpg", "DJI_0235.jpg" ]
实现方案
核心逻辑是先通过集合运算快速拿到两个列表的公共元素,再分别过滤两个列表后合并结果,时间效率远高于双层循环遍历。
Python 实现代码
def merge_list_remove_common(list1, list2): # 取两个列表的公共元素集合 common = set(list1).intersection(set(list2)) # 过滤掉两个列表里的公共元素 res1 = [x for x in list1 if x not in common] res2 = [x for x in list2 if x not in common] # 合并后按文件名排序可完全匹配示例输出顺序 return sorted(res1 + res2) # 测试用例运行 a = [ "DJI_0229.jpg", "DJI_0232.jpg", "DJI_0233.jpg", "DJI_0235.jpg" ] b = [ "DJI_0229.jpg", "DJI_0232.jpg", "DJI_0233.jpg", "DJI_0230.jpg", "DJI_0231.jpg", "DJI_0234.jpg" ] print(merge_list_remove_common(a, b))
运行上述代码会输出和示例完全一致的结果:
['DJI_0230.jpg', 'DJI_0231.jpg', 'DJI_0234.jpg', 'DJI_0235.jpg']
说明
- 用集合取交集的方式判断公共元素,单元素查询时间复杂度为O(1),处理大列表时性能优势明显
- 如果不需要对结果排序,去掉
sorted()即可保留元素在原列表中的相对顺序 - 该逻辑不会移除单个列表内部的重复元素,只会剔除两个列表共有的元素
内容的提问来源于stack exchange,提问作者Vas
相关产品推荐
相关产品推荐

