文章总结: 本文通过对比Python中list与set数据结构的性能差异,指出在去重和查找场景下set具有O(1)时间复杂度的效率优势。关键发现包括set基于哈希表的实现原理、三种去重写法的性能对比(含保序方案),以及set在百万数据去重、黑名单过滤等实战场景的应用。建议开发者根据场景选择数据结构,并提供了set的自动去重、交集运算等实用技巧与常见坑点提示。 综合评分: 82 文章分类: 安全开发,技术标准,解决方案,安全工具,其他
还在乱用列表?集合set才是去重和效率神器
原创
didiplus didiplus
攻城狮成长日记
2026年4月8日 07:01 广东
字数 1251,阅读大约需 7 分钟
你有没有遇到过这种情况👇
- • 列表去重写了一堆代码,结果还慢
- • 判断一个元素在不在列表里,程序卡成狗
- • 数据一多,性能直接崩掉
很多Python新手都有一个共同问题:
👉 什么都用 list(列表)解决
但你可能不知道—— 👉 有些场景下,set(集合)才是“降维打击”
今天这篇文章,我就带你彻底搞懂:为什么 set 才是去重和效率神器!
你有没有写过这样的代码👇
users = [1001, 1002, 1002, 1003, 1003, 1003]
result = []
for u in users:
if u not in result:
result.append(u)
写完你可能觉得:
👉 “没毛病啊,能跑就行”
但现实是👇
- • 数据一多,性能暴跌
- • 代码越来越长
- • 逻辑越来越乱
这不是你代码的问题,而是你用错了数据结构。
不是会不会写代码,而是会不会选结构
很多新手有一个典型特征:
👉 list 解决一切问题
但在真实开发中:
| 场景 | 最优结构 |
| — | — |
| 去重 | set |
| 查找 | set/dict |
| 有序数据 | list |
| 键值映射 | dict |
👉 选对结构 = 性能提升10倍起步
为什么list会越来越慢?
我们看一个常见操作👇
nums = list(range(1000000))
999999 in nums
这行代码本质在做什么?
👉 从头到尾一个一个找
也就是:
O(n) —— 数据越大越慢
你可以理解为👇
👉 list 是“排队找人”
⚡ set 为什么是效率神器?
nums = set(range(1000000))
999999 in nums
👉 几乎瞬间完成
为什么?
👉 因为底层是:哈希表(Hash Table)
你可以这样理解:
- • list:一个一个问 ❌
- • set:直接查“身份证号” ✅
时间复杂度:
O(1) —— 基本不受数据量影响
👉 这就是“数据结构碾压”
去重的3种写法(90%的人只会第一种)
❌ 写法1:低效版本
result = []
for n in nums:
if n not in result:
result.append(n)
👉 时间复杂度:O(n²)
✅ 写法2:set去重(最常用)
result = list(set(nums))
👉 快,但有问题:顺序会丢失
🧠 写法3:保序去重(推荐)
result = list(dict.fromkeys(nums))
👉 原理:
- •
dict在Python3.7+保持插入顺序 - • 利用
key不重复
👉 面试加分写法
真实项目场景
场景1:百万数据去重
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]
👉 set 让过滤变成“瞬间判断”
场景3:共同好友(交集)
a = {1, 2, 3}
b = {2, 3, 4}
print(a & b)
👉 社交 / 推荐系统常用
💡 set 的隐藏技巧
1️⃣ 自动去重 + 去空值
data = [1, 2, None, 2, None]
clean = {x for x in data if x is not None}
2️⃣ 快速去重字符串
text = "aaabbbccc"
print(set(text)) # {'a', 'b', 'c'}
3️⃣ 判断是否有重复(超实用)
def has_duplicate(nums):
return len(nums) != len(set(nums))
👉 面试高频题
set 的3个大坑
❌ 1. 无序
set([3, 1, 2]) # 顺序不可控
❌ 2. 不能放可变对象
s = {[1, 2]} # 报错!
👉 因为 list 不可 hash
❌ 3. 不是线程安全(进阶)
多线程环境需谨慎使用(了解即可)
🆚 list vs set
| 特性 | list | set | | — | — | — | | 是否有序 | ✅ | ❌ | | 是否可重复 | ✅ | ❌ | | 查找速度 | 慢 | 极快 | | 去重能力 | ❌ | ✅ |
🧠 认知升级
很多人学Python卡住,其实不是因为不会写代码,而是👇
👉 一直在用“错误的工具”解决问题
真正的高手思维是:
❌ 我怎么写代码 ✅ 我该用什么结构
📌 一句话记住👉 能用 set,就别用 list 做查找和去重
🎯 最后给你一个练习
实现一个函数:
👉 输入一个列表,返回:
- • 去重后的结果
- • 是否存在重复
- • 重复元素有哪些
Note
- • Python 入门第一课:为什么选择 Python?3 分钟搭建你的第一个程序
- • Python 入门第二课:变量和数据类型——给数据安个家
- • Python 入门第三课:让程序”开口说话”:90% 新手都忽略的输入输出技巧
- • 程序的抉择时刻?探索 if-else蕴藏的判断奥秘
- • 告别重复劳动!for/while循环让你效率翻10倍
- • 你的代码为什么又长又乱?可能是函数没用好
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:攻城狮成长日记 didiplus didiplus《还在乱用列表?集合set才是去重和效率神器》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论