当前位置: 首页 > news >正文

python中的集合(set)给列表去重

使用集合(set)给列表去重的核心原理是利用集合的“元素唯一性”特性自动过滤重复项。但需注意:直接转集合会丢失原始顺序;若需保留顺序,应结合字典(dict.fromkeys())或辅助集合实现。以下是具体方法:


一、基础去重方法

1. 直接转集合(不保序,最快)

  • 原理:集合天然不允许重复元素,将列表转为集合会自动去重。
  • 代码示例
    nums = unique = list(set(nums)) print(unique) # 输出:(顺序随机,**不保证原顺序**)
  • 适用场景无需保留原始顺序时(如统计唯一值、去重后直接排序等)。
  • 性能:时间复杂度O(n),是所有方法中最快的

2. 保序去重(推荐方法)

(1) 使用dict.fromkeys()(Python 3.7+)
  • 原理:Python 3.7+ 的字典默认保持插入顺序,用列表元素作键可同时去重并保序。
  • 代码示例
    nums = unique = list(dict.fromkeys(nums)) print(unique) # 输出:(**保留首次出现顺序**)
  • 优势代码简洁、性能高(O(n)),是官方推荐的保序去重方案。
(2) 辅助集合 + 循环(通用兼容)
  • 原理:遍历原列表,用集合记录已出现元素,仅添加新元素到结果列表。
  • 代码示例
    nums = seen = set() unique = [x for x in nums if x not in seen and not seen.add(x)] print(unique) # 输出:
  • 适用场景:需兼容旧版 Python(<3.7)或需自定义去重逻辑时。

二、关键注意事项

1.元素必须可哈希

  • 集合要求元素是可哈希的不可变对象(如数字、字符串、元组)。
  • 不可直接处理列表/字典等可变对象,需先转为可哈希类型:
    # 错误示例:列表不可哈希 # data = [, , ] # list(set(data)) # 报错:TypeError: unhashable type: 'list' # 正确做法:转为元组 data = [, , ] unique = [list(t) for t in set(tuple(x) for x in data)] print(unique) # 输出:[, ]
  • 自定义对象需实现__hash____eq__方法。

2. 顺序问题

  • set()去重不保留顺序:不同 Python 版本/运行环境结果顺序可能不同。
  • 保序方法的选择
    • 优先用dict.fromkeys()(Python 3.7+)。
    • 旧版本可用collections.OrderedDict
      from collections import OrderedDict unique = list(OrderedDict.fromkeys(nums))

3. 性能对比

方法是否保序时间复杂度适用场景
list(set(lst))O(n)无需顺序,速度最快
list(dict.fromkeys(lst))O(n)需保序的常规场景
循环 + 辅助集合O(n)需自定义逻辑或兼容旧版本
列表推导式(if x not inO(n²)小数据量,避免用于大数据集

大数据量时,O(n²) 方法(如列表推导式)性能显著劣于 O(n) 方法


三、复杂场景处理

1. 按对象属性去重

  • 场景:列表元素为字典/对象,需根据特定字段去重。
  • 解决方案:用字段值作为唯一标识,结合辅助集合:
    data = [{"id": 1, "name": "A"}, {"id": 1, "name": "B"}, {"id": 2, "name": "C"}] seen = set() unique = [x for x in data if x["id"] not in seen and not seen.add(x["id"])] print(unique) # 输出:[{'id': 1, 'name': 'A'}, {'id': 2, 'name': 'C'}]

2. 大数据量去重

  • 内存优化:流式处理避免一次性加载全部数据。
    def stream_deduplicate(iterable): seen = set() for item in iterable: if item not in seen: seen.add(item) yield item # 用法:unique = list(stream_deduplicate(large_data_stream))

总结

  • 无需保序:直接用list(set(original_list))速度最快
  • 需要保序优先用list(dict.fromkeys(original_list))(Python 3.7+),简洁高效。
  • 元素不可哈希:先转换为可哈希类型(如元组),再用集合去重。
  • 性能关键点:避免在循环中使用if x not in list(O(n²)),必须用集合辅助判断(O(1))。

以上方法均不修改原列表,而是返回新列表。若需原地去重,需结合切片赋值:original_list[:] = list(dict.fromkeys(original_list))

http://www.jsqmd.com/news/1339087/

相关文章:

  • SpringBoot开发——集成 OnlyOffice,5 分钟搞定 Word/Excel 在线编辑
  • 2026采购非标高低压成套设备评估研究 杭州之江开关作为区域代表性样本的交付能力判断标准
  • Havenlon | 杂谈:当没有人再谈论 AI
  • PyQt5桌面应用开发实战:浏览器多开软件列表显示设置功能实现
  • HsMod:55项功能全面增强炉石传说游戏体验的终极指南
  • 机械制图入门:从CAD模板到三视图标注的实战避坑指南
  • 乌鲁木齐平价超市避坑指南:别只看价格便宜,先弄清楚品类齐全度、采购便利性和售后边界 - 中国远见品牌企业资讯
  • DS4Windows终极指南:3步解决PlayStation手柄在Windows上的兼容性问题
  • 眉山正规防水补漏好评商家整理!卫生间地下室阳台渗漏水检测维修靠谱团队推荐(2026新版) - 吉林同城获客
  • 2026LED屏项目选公司口碑推荐,价格透明避坑不花冤枉钱 - 工业品牌热点
  • 乌鲁木齐社区超市怎么选?别只看便宜,先看商品齐全度、生鲜新鲜度和购物便利性 - 中国远见品牌企业资讯
  • Unity机器人仿真:从URDF导入到键盘控制关节运动的完整指南
  • 抖音无水印下载器:3分钟掌握批量下载的终极方案
  • Havenlon | 杂谈:企业买的从来不是能力峰值,而是能力下限
  • 盒马鲜生礼品卡闲置了回收多少钱?靠谱平台实测数据公开,这样卖确实划算 - 猎卡回收公众号
  • 【计算机毕业设计】基于SpringBoot电商秒杀系统的设计与实现
  • FGO自动化脚本技术深度解析:基于图像识别的智能战斗引擎设计
  • 彻底解决PyTorch CUDA版本不匹配:从报错到环境配置全攻略
  • 2026年 五金件加工厂家**单,非标五金件定制,机箱五金壳体,精密钣金加工,匠心工艺源头工厂优选 - 卓企推荐
  • Listen1音乐聚合播放器终极指南:一键解决音乐版权烦恼的免费神器
  • 【太原市】2026CPPM采购经理报考指南|正规机构甄选产业适配全攻略 - 中采供培
  • Unity游戏开发入门:五大核心代码模块构建可交互Demo
  • 成绩单翻译多少钱?2026 实测 4 大渠道,价格 / 流程 / 合规性全公开,留学入职不踩坑 - 信息快递
  • ViGEmBus:三大游戏控制器兼容性难题的终极解决方案
  • 掌握ComfyUI-Manager:3步解锁AI绘画节点的智能管理神器
  • 从零构建游戏角色皮肤展示页:前端实战与性能优化
  • 科研全流程工具避坑指南:从文献管理到论文写作与绘图的实战配置
  • 最强图像生成模型推荐
  • 从直方图到正态分布:数据实践者的核心概率思维与工程应用
  • TTS语音合成接口排错实战:从HTTP状态码到业务码的逐层定位