如何在Python中获取唯一的二元数组?无需第三方库
高效去重长度为2的子数组(忽略顺序)
你的原方法问题在于每次用in判断列表元素,这是线性遍历操作,数据量大时时间复杂度会达到O(n²),效率极低。改用集合存储已出现的"标准化"子数组,能把查询时间降到O(1),整体效率大幅提升。
方案1:生成新的去重列表
这种方式不修改原数组,返回去重后的结果:
nums = [[2, 9], [3, 6], [9, 2], [6, 3]] seen = set() unique = [] for pair in nums: # 将子数组转为有序元组作为唯一标识,让[2,9]和[9,2]对应同一个键 standardized = tuple(sorted(pair)) if standardized not in seen: seen.add(standardized) unique.append(pair) # 若需要避免原数组引用,可改用pair.copy() print(unique) # 输出: [[2, 9], [3, 6]]
方案2:原地修改原数组
如果你需要直接修改原nums数组,可采用这种方式:
nums = [[2, 9], [3, 6], [9, 2], [6, 3]] seen = set() idx = 0 while idx < len(nums): pair = nums[idx] standardized = tuple(sorted(pair)) if standardized in seen: # 发现重复则删除当前元素,索引不递增(删除后后续元素会前移) del nums[idx] else: seen.add(standardized) idx += 1 print(nums) # 输出: [[2, 9], [3, 6]]
关键优化点
- 利用有序元组作为子数组的唯一标识:因为子数组长度固定为2,排序的开销可以忽略不计,但能让顺序相反的子数组被识别为同一元素
- 集合的查询/插入操作平均时间复杂度为O(1),整体处理时间复杂度为O(n),面对大规模数据时比原方法快得多
内容的提问来源于stack exchange,提问作者ClayMix
相关产品推荐
相关产品推荐

