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

admin 2026-04-13 07:10:11 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文通过对比Python中list与set数据结构的性能差异,指出在去重和查找场景下set具有O(1)时间复杂度的效率优势。关键发现包括set基于哈希表的实现原理、三种去重写法的性能对比(含保序方案),以及set在百万数据去重、黑名单过滤等实战场景的应用。建议开发者根据场景选择数据结构,并提供了set的自动去重、交集运算等实用技巧与常见坑点提示。 综合评分: 82 文章分类: 安全开发,技术标准,解决方案,安全工具,其他


cover_image

还在乱用列表?集合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才是去重和效率神器》

screen会话管理 网络安全文章

screen会话管理

文章总结: 本文介绍基于GNUScreen开发的可重入程序运行环境管理器,通过Python控制器实现自动化会话管理。系统核心功能包括会话标识发现、优雅终止重建机
评论:0   参与:  0