You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何快速对含数百万整数对的大型列表进行去重

Python 百万级整数对列表最高效去重方案

首先明确两种旧方案的性能/逻辑问题:

  • 空列表+if not in判断的方案时间复杂度为O(n²):列表的成员判断需要线性遍历全表,百万级数据下总操作量可达万亿级,耗时必然无法满足需求。
  • Numpy isin 方法本身针对一维标量元素设计,只会逐元素匹配值,不会将整数对作为整体判断,因此无法直接作用于二维整数对结构的去重。

方案1:纯Python原生实现(列表数据源首选,综合速度最快)

利用集合(set)平均O(1)时间复杂度的成员判断特性实现去重,由于列表是可变类型不可哈希,将每个整数对转为不可变元组存入去重标记集合即可。Python 3.7+ 版本会自动保留元素首次出现的顺序:

def deduplicate_pairs(data):
    seen = set()
    result = []
    for pair in data:
        pair_tuple = tuple(pair)
        if pair_tuple not in seen:
            seen.add(pair_tuple)
            result.append(pair)
    return result
  • 性能说明:该方案总时间复杂度为O(n),处理百万级整数对通常仅需0.1~0.3秒,无额外依赖,内存开销最低。
  • 适配说明:如果使用Python 3.7以下版本且需要保留原始顺序,可以将seen替换为collections.OrderedDict,以元组为键、None为值存储,最后取字典键转回列表即可。

注意:不要采用将整数对拼接为字符串的方式做去重标记,字符串序列化/反序列化的开销远高于直接转元组,会明显拉低处理速度。


方案2:Numpy实现(数据源已是Numpy数组时首选)

不需要使用isin,直接调用np.unique并指定axis=0参数,即可按整行(即单个整数对)维度做去重:

import numpy as np
def deduplicate_pairs_np(arr):
    # arr 为已转换完成的shape为(n,2)的numpy整数数组
    # 不需要保序的最简写法,结果会按整数对大小排序
    # unique_arr = np.unique(arr, axis=0)
    
    # 保留原始出现顺序的写法(兼容numpy 1.23+版本)
    unique_arr, indices = np.unique(arr, axis=0, return_index=True)
    unique_arr = unique_arr[np.argsort(indices)]
    
    # 需要返回Python嵌套列表就加.tolist(),直接用numpy数组可省略
    return unique_arr.tolist()
  • 性能说明:如果原始数据是Python嵌套列表,转numpy数组会产生额外格式转换开销,整体速度略慢于原生set方案;如果原始数据已经是numpy数组,该方案性能和原生方案基本持平。

内容的提问来源于stack exchange,提问作者Error Replicator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 11:12:25