当前位置: 首页
业界动态
还在乱用列表?集合 set 才是去重和效率神器

还在乱用列表?集合 set 才是去重和效率神器

热心网友 时间:2026-04-15
转载

不是会不会写代码,而是会不会选结构

你有没有遇到过这种情况:为了给列表去重,吭哧吭哧写了好几行循环判断,结果数据量一大,程序就慢得让人心焦。或者,想判断一个元素在不在列表里,程序直接“卡成狗”。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

这其实不是代码逻辑的问题,而是数据结构没选对。很多Python初学者都有一个共同的习惯:遇到问题,下意识就用列表(list)来解决一切。但你可能不知道,在某些特定场景下,集合(set)才是真正的“降维打击”神器。

回想一下,你是不是写过这样的代码?

users = [1001, 1002, 1002, 1003, 1003, 1003]
result = []
for u in users:
    if u not in result:
        result.append(u)

写完可能觉得:“逻辑清晰,能跑就行”。但现实往往很骨感:一旦数据量上来,性能就会暴跌;代码越堆越长,逻辑也越来越绕。

问题的根源在于,你用错了工具。在真实的开发世界里,选对数据结构,性能提升十倍起步是常有的事。

为什么list会越来越慢?

来看一个最常见的操作:在一个列表中查找某个元素是否存在。

nums = list(range(1000000))
999999 in nums

这行代码在底层做了什么?它需要从列表的第一个元素开始,一个一个地问:“是你吗?”,直到找到目标或者问完所有人。这种查找方式,在算法复杂度里被称为 O(n)。简单说,就是数据量(n)越大,查找所花的时间就越长,呈线性增长。

你可以把它想象成在一条长长的队伍里“排队找人”,必须从头到尾一个个看过去。

set 为什么是效率神器?

同样的任务,换成集合(set)试试:

nums = set(range(1000000))
999999 in nums

几乎是瞬间完成。为什么差距这么大?因为集合的底层实现是哈希表(Hash Table)。

这好比什么呢?列表是“排队找人”,而集合是“直接查身份证号”。每个元素进入集合时,都会根据其值计算出一个唯一的“地址”(哈希值)。查找时,直接去这个地址看一眼就知道有没有,根本不需要遍历。

它的时间复杂度是 O(1),意味着查找时间基本不受数据总量影响,这才是真正的“数据结构碾压”。

去重的3种写法(90%的人只会第一种)

明白了原理,再来看去重这个经典问题。其实写法不止一种,但效率天差地别。

❌ 写法1:低效循环版

result = []
for n in nums:
    if n not in result:
        result.append(n)

这是最直观的写法,但效率最低。因为每次`n not in result`都要遍历一次结果列表,整体时间复杂度达到了 O(n²)。数据量稍大,就能明显感觉到卡顿。

✅ 写法2:set去重(最常用)

result = list(set(nums))

这是最经典的用法,利用集合自动去重的特性,一行代码搞定,速度极快。但有一个需要注意的问题:原始顺序会丢失。因为集合本身是无序的。

? 写法3:保序去重(推荐)

result = list(dict.fromkeys(nums))

如果你需要保留元素第一次出现的顺序,推荐这个方法。它的原理很巧妙:从Python 3.7开始,字典(dict)会保持键(key)的插入顺序。同时,字典的键本身就是不重复的。`dict.fromkeys(nums)`会以nums的元素为键创建一个新字典,自动去重并保序,最后再转回列表即可。

真实项目场景

理论说再多,不如看几个实战场景。

场景1:百万级用户ID去重

user_ids = load_data() # 假设这里加载了百万条数据
unique_users = set(user_ids)

用列表循环可能需要几秒甚至更久,而用集合,往往是几毫秒的事。这在处理日志、用户行为数据时非常实用。

场景2:黑名单快速过滤

blacklist = {1002, 1005, 1010}
users = [1001, 1002, 1003]
safe_users = [u for u in users if u not in blacklist]

将黑名单定义为集合,使得`u not in blacklist`这个判断变成了O(1)的瞬时操作,即使黑名单很大,过滤速度也极快。

场景3:寻找共同好友(集合运算)

a = {1, 2, 3} # 用户A的好友集合
b = {2, 3, 4} # 用户B的好友集合
print(a & b) # 输出: {2, 3},即共同好友

集合支持交集(&)、并集(|)、差集(-)等数学运算,在社交、推荐系统等需要比较群体关系的场景下非常方便。

set 的隐藏技巧

除了去重和查找,集合还有一些巧妙的用法:

自动去重并清理空值:

data = [1, 2, None, 2, None]
clean = {x for x in data if x is not None}
# 结果: {1, 2}

结合集合推导式,可以一步完成过滤和去重。

快速提取字符串中的唯一字符:

text = "aaabbbccc"
print(set(text)) # 输出: {'a', 'b', 'c'}

一行代码判断列表是否有重复元素:

def has_duplicate(nums):
    return len(nums) != len(set(nums))
# 如果列表长度和去重后的集合长度不等,说明一定有重复。

set 的三个大坑

当然,集合并非万能,使用时也要避开几个常见的“坑”:

❌ 无序性:集合中的元素没有固定的顺序。

print(set([3, 1, 2])) # 输出可能是 {1, 2, 3},也可能是其他顺序。

❌ 不能存放可变对象:集合的元素必须是“可哈希的”(hashable)。像列表、字典这类可变对象是不可哈希的,不能作为集合元素。

s = {[1, 2]} # 报错!TypeError: unhashable type: 'list'

❌ 非线程安全(进阶注意):在多个线程同时修改同一个集合时,可能会遇到问题。这在高级并发编程中需要留意。

list vs set 认知升级

很多人在学习Python时感到进步缓慢,问题往往不在于不会写`for`循环或`if`判断,而是一直在用“错误的工具”解决问题。

真正的编程高手思维包含两个层面:一是“我该怎么写这段代码”,二是“我应该用什么数据结构来组织我的数据”。后者往往更能决定程序的效率和优雅程度。

记住一个核心原则:凡是涉及成员查找(`in`操作)或去重的场景,优先考虑使用集合(set),而不是列表(list)。

最后给你一个练习

为了巩固理解,可以尝试实现一个函数,输入一个列表,要求返回:

  1. 去重后的结果(保留原始顺序)。
  2. 一个布尔值,指示原列表是否存在重复元素。
  3. 一个列表,包含所有重复出现的元素(每个重复元素只列一次)。

试试看,你会如何设计?

来源:https://www.51cto.com/article/840181.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
日产重塑英菲尼迪:弃独立平台,推7款新车强化差异化

日产重塑英菲尼迪:弃独立平台,推7款新车强化差异化

日产重塑英菲尼迪战略:放弃独立平台,聚焦7款新车打造核心差异化 4月16日,日产汽车首席执行官内田诚(Makoto Uchida)对英菲尼迪品牌的现状与发展路径进行了深入剖析。他指出,这一豪华品牌近年来面临的市场挑战,主要源于过往关键战略的调整,目前品牌正处在全面重塑与战略转型的关键时期。 内田诚直

时间:2026-04-16 13:10
沃尔沃迎99周年:发布新型头颈保护座椅,女性颈椎伤风险降50%

沃尔沃迎99周年:发布新型头颈保护座椅,女性颈椎伤风险降50%

沃尔沃迎99周年:发布新型头颈保护座椅,女性颈椎伤风险降50% 2026年4月16日,沃尔沃汽车迎来了品牌创立99周年的重要里程碑。选择在这个极具纪念意义的时刻发布全新安全技术,深刻诠释了其将“安全”这一核心品牌基因不断推向新境界的决心。发布会上,沃尔沃汽车安全防护领域高级技术专家洛塔·雅各布森女士

时间:2026-04-16 13:07
Pinia 全新版本!以后不再需要 Axios!

Pinia 全新版本!以后不再需要 Axios!

Pinia Colada:为Vue应用注入优雅的数据请求体验 在Vue js应用开发过程中,高效管理数据请求是提升开发效率和保障代码质量的核心环节。Pinia Colada正是为此而设计的解决方案。作为Pinia生态体系中的上层封装库,其核心目标非常明确:彻底消除数据请求环节中重复的模板代码与复杂逻

时间:2026-04-16 13:02
沃尔沃全新EX90纯电旗舰SUV发布:2+3+2式七座布局、双电机四驱,预售价53.99万元起

沃尔沃全新EX90纯电旗舰SUV发布:2+3+2式七座布局、双电机四驱,预售价53.99万元起

沃尔沃全新EX90纯电旗舰SUV发布:2+3+2式七座布局、双电机四驱,预售价53 99万元起 值此沃尔沃品牌创立99周年之际,其备受期待的全新纯电旗舰SUV——EX90于今日正式开启预售。新车基于先进的SPA2原生豪华纯电平台打造,首发推出双电机四驱版Plus与双电机四驱高性能版Ultra两款车型

时间:2026-04-16 12:56
哪家 GEO 优化服务商专业?2026 年 4 月推荐评测口碑对比 TOP7 服务排名领先电商品牌流量转化困境

哪家 GEO 优化服务商专业?2026 年 4 月推荐评测口碑对比 TOP7 服务排名领先电商品牌流量转化困境

生成式AI时代,品牌如何抢占“语义主权”?聚焦三家值得关注的GEO服务商 生成式AI的浪潮正以前所未有的速度重塑企业与用户的连接界面。如今,大型语言模型日益成为人们获取信息、辅助决策的首选入口。在此背景下,GEO(生成式引擎优化)的重要性不言而喻——它不再只是一种技术优化,而是品牌在AI时代争夺“语

时间:2026-04-16 12:53
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程