如何使用Python提取两个二维数组中的公共元素?
Python提取两个二维数组公共元素的实现方案
一维列表求公共元素的集合方案无法直接用于二维数组,原因是列表是不可哈希类型,不能作为集合元素,只要解决子列表的哈希问题就能复用集合的高效求交逻辑。以下是两种常用实现方案:
方案1:元组转集合求交(推荐,性能最优)
- 适用场景:所有子列表内的元素都是可哈希类型(数字、字符串、元组等,绝大多数常规业务场景都满足)
- 实现思路:把两个数组里的子列表转成可哈希的元组类型,就可以用集合的交集运算快速找公共元素,最后再把结果转回列表格式即可。
- 代码示例:
# 测试用二维数组 a = [[1,2], [3,4], [5,6]] b = [[7,8], [1,2], [87,65], [3,4]] # 先把数组b的所有子列表转元组存入集合,集合查找时间复杂度为O(1) b_tuple_set = set(map(tuple, b)) # 遍历数组a,筛选出同时存在于b中的子列表,保留a中原有顺序 c = [sub_list for sub_list in a if tuple(sub_list) in b_tuple_set] print(c) # 输出结果:[[1, 2], [3, 4]]
- 补充说明:
- 如果不需要保留原数组顺序、且需要结果自动去重,可以直接计算两个元组集合的交集,写法更简洁:
# 注意:该写法结果顺序不固定 c = list(map(list, set(map(tuple, a)) & set(map(tuple, b))))- 该方案时间复杂度为O(n+m),远高于遍历比对的方案,两个数组数据量较大时优先选这个。
方案2:直接遍历比对
- 适用场景:子列表内存在不可哈希元素(比如子列表里还嵌套了列表),无法转成元组使用集合的场景,或者数据量很小的简单场景。
- 实现思路:双层循环逐个比对两个数组的子列表是否相等,把相等的子列表存入结果即可。
- 代码示例:
a = [[1,2], [3,4], [5,6]] b = [[7,8], [1,2], [87,65], [3,4]] c = [] for item_a in a: for item_b in b: # 比对两个子列表是否完全相等,且结果里还没存过该元素(去重,不需要可删除该判断) if item_a == item_b and item_a not in c: c.append(item_a) print(c) # 输出结果:[[1, 2], [3, 4]]
- 补充说明:该方案时间复杂度为O(n*m),两个数组长度都很大时运行效率会很低,非必要不优先使用。
内容的提问来源于stack exchange,提问作者Ramyashree bk
相关产品推荐
相关产品推荐

