惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Troy Hunt's Blog
T
The Exploit Database - CXSecurity.com
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
F
Fortinet All Blogs
博客园_首页
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
The Cloudflare Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
H
Heimdal Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
AI
AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Security Affairs
The Register - Security
The Register - Security
S
Security @ Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
Schneier on Security
Schneier on Security
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
T
Tailwind CSS Blog
Hacker News: Ask HN
Hacker News: Ask HN
W
WeLiveSecurity
D
Docker
L
LangChain Blog
B
Blog RSS Feed
The Last Watchdog
The Last Watchdog
Cloudbric
Cloudbric
TaoSecurity Blog
TaoSecurity Blog
N
Netflix TechBlog - Medium
酷 壳 – CoolShell
酷 壳 – CoolShell
I
InfoQ
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
宝玉的分享
宝玉的分享
I
Intezer
云风的 BLOG
云风的 BLOG
V2EX - 技术
V2EX - 技术
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - 箫笛

Tkinter - Button 组件 Tkinter - Label 组件 Tkinter - tk 变量 Tkinter - 事件与绑定 Tkinter - 几何管理器 Tkinter - 核心概念 Tkinter - 快速开始 Tkinter - 介绍 Python 编程 - 条件表达式 Python 编程 - 星号下划线参数释义 shell 编程 - shell 脚本的交互方式 Python insall - macOS 系统安装python的几种方式 Miniconda - Python 环境管理工具 Tkinter - Python GUI 开发 Python 编程 - 下划线命名的区别 Python 编程 - 元类编程 Python 编程 - 多重继承与MRO Python 编程 - 描述符协议 Python 编程 - 类型注解 Python 编程 - 生成器表达式 Python 编程 - 装饰器 Python 编程 - 闭包 Python 编程 - 列表推导式 Python 编程 - 函数式编程 Python 编程 - lambda 函数 Python 编程 - 文件操作 Python 编程 - 输入与输出 Python 编程 - 面向对象编程 Python 编程 - 元组(tuple) Python 编程 - 字符串(str) Python 编程 - 字典(dict) Python 编程 - 列表(list) Python 编程 - 数据类型和数据结构 Python 编程 - 语句 Python 编程 - 函数 windows - WSL 的安装与使用 shell编程 - dialog 程序使用指南 FE Team - 如何做好前端代码审查 git 提交的撤销和恢复 React15 - redux-saga 如何在saga中实现轮询接口调用? React15 - React CSS Modules BEM命名实践 React15 - React 15 中 componentWillReceiveProps 为什么会多次调用, 同时componentDidUpdate 也会多次调用? React15 - React15类组件多次执行render方法的原因? React15 - React15应用中代码逻辑复用方案 React15 - React状态同步问题解决 React15 - React 15 中 React.pureComponent 的使用场景 React15 - React 15应用在页面渲染时会多次执行类组件的render 函数的原因 React15 - React 15 中能用 componetDidUpdate 代替 componentWillReceiveProps 吗? React15 - React 15 生命周期函数详解 React15 - 如何在React 15中实现自定义的事件订阅与发送(例如组件间通信) React15 - React15应用中的事件订阅和发送机制 React15 - CSS中的BEM规范 React15 - React CSS Modules BEM命名实践 React15 - 写sass 样式文件,嵌套的结构好,还是扁平的结构好? React15 - sass 中 @mixin 和 @extend 的区别是什么? React15 - React 15 应用 如何使用Css moudules 方式进行模块化开发 React15 - React15应用Sass使用指南 React15 - React 15 应用如何进行性能优化?
Python 编程 - 集合
箫笛 · 2026-06-25 · via 博客园 - 箫笛

Python 3 中的集合(set)是一种无序、不重复的元素容器,底层基于哈希表实现,因此成员检测、添加、删除等操作的平均时间复杂度为 O(1)。它非常适合用于去重、关系运算(并、交、差等)和快速成员资格测试。


1. 创建集合

# 使用花括号(注意:空集合不能写成 {},因为那是空字典)
s1 = {1, 2, 3}

# 使用 set() 构造函数,可传入任意可迭代对象
s2 = set([1, 2, 2, 3])          # {1, 2, 3}
s3 = set("hello")               # {'h', 'e', 'l', 'o'}(无序)
s4 = set(range(5))              # {0, 1, 2, 3, 4}

# 空集合
empty_set = set()

2. 基本操作(增删改查)

方法 / 操作 说明
s.add(x) 添加元素 x,若已存在则无影响
s.remove(x) 移除 x,若不存在则抛出 KeyError
s.discard(x) 移除 x,若不存在也不报错
s.pop() 随机移除并返回一个元素(集合为空时抛出 KeyError
s.clear() 清空所有元素
x in s 成员测试,返回 True / False
len(s) 元素个数
s = {1, 2, 3}
s.add(4)          # {1,2,3,4}
s.discard(2)      # {1,3,4}
s.remove(5)       # KeyError!

3. 集合运算(数学操作)

运算 符号 方法 说明
并集 | union() 返回两个集合的并集
交集 & intersection() 返回交集
差集 - difference() 返回在左不在右的元素
对称差 ^ symmetric_difference() 返回不同时存在于两集合的元素
a = {1, 2, 3}
b = {3, 4, 5}

print(a | b)          # {1,2,3,4,5}
print(a & b)          # {3}
print(a - b)          # {1,2}
print(a ^ b)          # {1,2,4,5}

就地更新版本update()|=)、intersection_update()&=)、difference_update()-=)、symmetric_difference_update()^=),它们会修改原集合。


4. 其他常用方法

  • s.isdisjoint(t):判断 s 与 t 是否不相交(无共同元素)
  • s.issubset(t)<=):s 是否为 t 的子集
  • s.issuperset(t)>=):s 是否为 t 的超集
  • s.copy():返回集合的浅拷贝
{1, 2}.issubset({1, 2, 3})   # True
{1, 2}.isdisjoint({3, 4})    # True

5. 集合推导式(Set Comprehension)

与列表推导类似,但使用花括号:

s = {x**2 for x in range(5)}      # {0, 1, 4, 9, 16}
s = {c.upper() for c in "hello"}  # {'H','E','L','O'}

6. 冻结集合(frozenset

frozenset 是不可变版本,创建后不能修改。它可哈希,因此可以作为字典的键或其他集合的元素。

fs = frozenset([1, 2, 3])
# fs.add(4)  # 报错 AttributeError
d = {fs: "value"}   # 合法

7. 重要注意事项

  • 元素必须可哈希(hashable):即不可变类型(数字、字符串、元组等),列表、字典、集合本身不能作为集合元素。
  • 无序性:集合不保证元素顺序,因此不能通过索引访问。
  • 性能:成员测试 in 比列表快得多(O(1) vs O(n)),适合大型数据去重和查找。

8. 典型应用场景

  • 去除列表中的重复项:list(set(lst))
  • 快速检查某元素是否存在
  • 计算两组数据的交集、差集等
  • 关系数据库中的“投影”或“连接”操作模拟

9. 示例:实用去重与比较

# 去重并保留原顺序(Python 3.7+ 字典有序)
lst = [3, 1, 2, 1, 3]
unique_ordered = list(dict.fromkeys(lst))   # [3,1,2]

# 或使用集合 + 排序(若顺序不重要)
unique = list(set(lst))