如何高效构建无重复字典列表(start与end互换视为重复)
结论先行
你的现有实现既存在逻辑漏洞,也不是性能最优的方案,完全不适合处理1亿条规模的数据。
现有实现的问题
- 逻辑BUG:直接拼接
start+end+type再排序的方式会出现跨字段误判,例如start='12', end='34', type='a'和start='1', end='234', type='a'会被判定为重复,二者拼接后的字符串都是1234a,排序结果完全一致,实际这两条数据并不符合你的重复判定规则。 - 性能极差:每一条数据都需要执行3次字段拼接、全字符排序、二次拼接,这三个操作都是字符串高开销操作,1亿条数据的累计耗时会非常高。
最优实现方案
按优先级从高到低选择:
1. 纯Python场景最高效方案(无需额外依赖)
修改去重键的生成逻辑,不需要对全字符排序,仅对start和end做大小比较后按固定顺序组合即可,时间开销比原有逻辑低70%以上:
relations = [] duplicate_keys = set() for my_dict in list_of_dicts: s, e, t = my_dict['start'], my_dict['end'], my_dict['type'] # 固定顺序生成唯一键,无边界问题,无需排序 key = (s, e, t) if s < e else (e, s, t) if key not in duplicate_keys: relations.append(my_dict) duplicate_keys.add(key)
注:tuple作为set的键是Python原生支持的哈希操作,底层是C实现,比字符串拼接排序快很多。
2. 亿级数据场景最优方案(用向量化工具)
纯Python循环处理1亿条数据还是偏慢,建议用pandas或polars的向量化操作,底层是C实现,性能是纯Python的10~100倍:
import pandas as pd df = pd.DataFrame(list_of_dicts) # 生成固定顺序的起止字段 df['min_se'] = df[['start', 'end']].min(axis=1) df['max_se'] = df[['start', 'end']].max(axis=1) # 按规则去重,保留第一条 df = df.drop_duplicates(subset=['min_se', 'max_se', 'type'], keep='first') # 转成字典列表 relations = df[['start', 'end', 'type']].to_dict('records')
如果数据量超过内存上限,可以用pandas的分块读取功能,或者内存效率更高的polars库处理。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

