Python高级数据类型:集合(Set)

集合是Python中一种非常有用的数据结构,它与列表类似但具有独特的特性。本文将全面介绍集合的所有知识点,从基础概念到高级用法,帮助初学者彻底掌握集合的使用。

1. 集合简介

1.1 什么是集合?

集合(Set)是Python中的一种无序、不重复元素的容器。它类似于数学中的集合概念,具有以下主要特点:

  • 元素唯一性:集合中的元素不会重复

  • 无序性:元素没有固定顺序

  • 可变性:可以添加或删除元素

  • 元素不可变性:集合中的元素必须是不可变类型(如数字、字符串、元组等)

1.2 为什么需要集合?

集合主要解决两个问题:

  1. 去重:自动去除重复元素

  2. 关系运算:高效执行集合运算(交集、并集、差集等)

2. 集合的创建与基本操作

2.1 创建集合

# 方法1:使用花括号(注意与字典的区别)
s1 = {1, 2, 3, 2, 1}  # 自动去重,结果为{1, 2, 3}# 方法2:使用set()构造函数
s2 = set()  # 创建空集合
s3 = set([1, 2, 3, 2, 1])  # 从列表创建,结果为{1, 2, 3}# 方法3:从字符串创建(会拆分为字符)
s4 = set("hello")  # 结果为{'h', 'e', 'l', 'o'}

注意:创建空集合必须使用set(),因为{}表示空字典。

2.2 集合的元素特性

集合中的元素必须满足:

  • 不可变:不能是列表、字典、集合等可变类型

  • 可哈希:必须实现__hash__方法

合法元素示例:

valid_set = {1, "hello", (1, 2, 3), True, 3.14}

非法元素示例:

invalid_set = {[1, 2], {"a": 1}, {1, 2}}  # 会报TypeError

2.3 集合的去重特性

集合自动去除重复元素:

numbers = [1, 2, 3, 2, 1, 4, 5, 4]
unique_numbers = set(numbers)  # 结果为{1, 2, 3, 4, 5}

3. 集合的基本操作

3.1 添加元素

s = {1, 2, 3}# 添加单个元素
s.add(4)  # s变为{1, 2, 3, 4}# 添加多个元素
s.update([5, 6, 7])  # s变为{1, 2, 3, 4, 5, 6, 7}
s.update({8, 9}, [10, 11])  # 可以混合添加

3.2 删除元素

s = {1, 2, 3, 4, 5, 6}# 方法1:remove() - 删除指定元素,不存在则报错
s.remove(3)  # s变为{1, 2, 4, 5, 6}# 方法2:discard() - 删除指定元素,不存在不报错
s.discard(10)  # 无变化# 方法3:pop() - 随机删除并返回一个元素
item = s.pop()  # 随机删除一个元素# 方法4:clear() - 清空集合
s.clear()  # s变为set()

3.3 查询操作

s = {1, 2, 3, 4, 5}# 检查元素是否存在
print(3 in s)  # 输出: True
print(6 not in s)  # 输出: True# 获取集合长度
print(len(s))  # 输出: 5

3.4 集合的不可修改性

集合中的元素不能直接修改,因为集合是基于哈希表实现的。如果需要"修改"元素,只能先删除再添加:

s = {1, 2, 3}# 错误做法(会报错)
# s[0] = 10  # 正确做法:先删除再添加
s.remove(1)
s.add(10)  # s变为{2, 3, 10}

4. 集合的关系运算

集合最强大的功能之一是能够执行数学上的集合运算。

4.1 交集(Intersection)

返回两个集合中都存在的元素。

s1 = {1, 2, 3}
s2 = {2, 3, 4}# 方法1:使用&运算符
print(s1 & s2)  # 输出: {2, 3}# 方法2:使用intersection()方法
print(s1.intersection(s2))  # 输出: {2, 3}

4.2 并集(Union)

返回两个集合中所有不重复的元素。

# 方法1:使用|运算符
print(s1 | s2)  # 输出: {1, 2, 3, 4}# 方法2:使用union()方法
print(s1.union(s2))  # 输出: {1, 2, 3, 4}

4.3 差集(Difference)

返回只存在于第一个集合中的元素。

# 方法1:使用-运算符
print(s1 - s2)  # 输出: {1}
print(s2 - s1)  # 输出: {4}# 方法2:使用difference()方法
print(s1.difference(s2))  # 输出: {1}

4.4 对称差集(Symmetric Difference)

返回两个集合中不相同的元素(即只存在于其中一个集合中的元素)。

# 方法1:使用^运算符
print(s1 ^ s2)  # 输出: {1, 4}# 方法2:使用symmetric_difference()方法
print(s1.symmetric_difference(s2))  # 输出: {1, 4}

4.5 子集与超集

判断一个集合是否完全包含于或包含另一个集合。

a = {1, 2, 3}
b = {1, 2}# 子集判断
print(b < a)  # 输出: True(b是a的真子集)
print(b <= a)  # 输出: True(b是a的子集或相等)# 超集判断
print(a > b)  # 输出: True(a是b的真超集)
print(a >= b)  # 输出: True(a是b的超集或相等)# 方法形式
print(b.issubset(a))  # 输出: True
print(a.issuperset(b))  # 输出: True

4.6 集合相等性

判断两个集合是否包含相同的元素(不考虑顺序)。

x = {1, 2, 3}
y = {3, 2, 1}print(x == y)  # 输出: True
print(x != y)  # 输出: False

5. 集合的高级用法

5.1 集合推导式

类似于列表推导式,可以快速生成集合。

# 基本语法
{expression for item in iterable}
{expression for item in iterable if condition}# 示例1:创建平方数集合
squares = {x**2 for x in range(10)}
# 输出: {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}# 示例2:筛选偶数平方
even_squares = {x**2 for x in range(10) if x % 2 == 0}
# 输出: {0, 4, 16, 36, 64}# 示例3:字符串处理
words = ["hello", "world", "python"]
unique_chars = {char for word in words for char in word}
# 输出: {'d', 'e', 'h', 'l', 'n', 'o', 'p', 'r', 't', 'w', 'y'}

5.2 冻结集合(frozenset)

frozenset是不可变集合,可以作为字典的键或另一个集合的元素。

fs = frozenset([1, 2, 3, 2, 1])  # 创建冻结集合# 可以作为字典的键
d = {fs: "frozen set"}  # 合法# 可以作为集合的元素
s = {fs, frozenset([4, 5, 6])}  # 合法

5.3 集合与列表的转换

# 列表去重(常用技巧)
lst = [1, 2, 3, 2, 1, 4, 5, 4]
unique_lst = list(set(lst))  # 转换为集合去重,再转回列表# 注意:顺序可能改变
print(unique_lst)  # 可能输出: [1, 2, 3, 4, 5]

5.4 集合的性能优势

集合基于哈希表实现,查找操作时间复杂度为O(1),远快于列表的O(n)。

# 查找元素性能比较
big_list = list(range(1000000))
big_set = set(big_list)# 列表查找(慢)
%timeit 999999 in big_list  # 约10ms# 集合查找(快)
%timeit 999999 in big_set  # 约100ns

6. 集合的实际应用场景

6.1 数据去重

# 去除重复单词
text = "hello world hello python world"
words = text.split()
unique_words = set(words)  # {'hello', 'world', 'python'}

6.2 关系测试

# 找出共同好友
alice_friends = {"Bob", "Charlie", "Diana"}
bob_friends = {"Alice", "Charlie", "Eve"}common_friends = alice_friends & bob_friends  # {'Charlie'}

6.3 成员快速查找

# 高效检查元素是否存在
valid_users = {"alice", "bob", "charlie"}
username = input("请输入用户名: ")
if username in valid_users:print("欢迎回来!")
else:print("用户名不存在")

6.4 过滤数据

# 筛选出只出现一次的元素
from collections import Counterdata = [1, 2, 3, 2, 1, 4, 5, 4, 6]
counts = Counter(data)
unique_elements = {x for x in data if counts[x] == 1}  # {3, 5, 6}

7. 集合与其他数据结构的比较

特性集合(set)列表(list)字典(dict)
有序性无序有序Python 3.7+有序
元素唯一性唯一可重复键唯一
可变性可变可变可变
元素类型必须不可变任意键必须不可变,值任意
查找速度O(1)O(n)O(1)
主要用途去重、关系运算有序数据存储键值对映射

8. 常见问题与解答

Q1: 为什么集合是无序的?

集合基于哈希表实现,为了快速查找(O(1)时间复杂度),元素存储位置由哈希值决定,因此不保持插入顺序。

注意:Python 3.7+中,集合实际上保持了插入顺序,但这被视为实现细节,不应依赖。

Q2: 集合和字典有什么关系?

集合相当于只有键没有值的字典。实际上,Python的集合就是使用字典实现的,只是所有值都是None

Q3: 如何选择使用列表还是集合?

  • 需要保持顺序或允许重复 → 使用列表

  • 需要快速查找或去重 → 使用集合

  • 需要关系运算 → 使用集合

Q4: 为什么集合的元素必须是不可变的?

因为集合基于哈希表实现,可变对象无法生成固定哈希值,会导致集合内部结构混乱。

9. 练习题

练习1:去重统计

# 统计一段文本中不同单词的数量
text = """Python is an easy to learn powerful programming language.
It has efficient high-level data structures and a simple but effective
approach to object-oriented programming. Python is easy to learn."""words = text.split()
unique_words = set(words)
print(f"不同单词数量: {len(unique_words)}")

练习2:共同兴趣

# 找出两个人的共同兴趣
alice_interests = {"reading", "hiking", "coding", "movies"}
bob_interests = {"coding", "movies", "gaming", "cooking"}common_interests = alice_interests & bob_interests
print(f"共同兴趣: {common_interests}")

练习3:集合运算

# 给定三个集合,找出只在A中出现的元素
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7}
C = {5, 6, 7, 8}result = A - (B | C)
print(f"只在A中的元素: {result}")

10. 总结

集合是Python中非常有用的数据结构,主要特点包括:

  1. 元素唯一性:自动去重

  2. 无序性:元素没有固定顺序

  3. 高效查找:基于哈希表实现,查找速度O(1)

  4. 关系运算:支持交集、并集、差集等数学运算

  5. 元素限制:只能包含不可变类型

掌握集合的使用可以:

  • 简化去重操作

  • 提高查找效率

  • 实现复杂的关系运算

  • 优化程序性能

建议在实际编程中多尝试使用集合,特别是需要去重或快速查找的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89535.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity编辑器开发GUI.Window】

Unity GUI.Window 笔记 根据官方文档2021版本的&#xff0c;点击链接跳转记录 概述 GUI.Window 是 Unity IMGUI 系统中用于创建弹出窗口的核心方法&#xff0c;具有以下关键特性&#xff1a; 浮动窗口&#xff1a;浮于普通 GUI 控件之上焦点控制&#xff1a;可通过点击获得焦…

CAN通信驱动开发注意事项

以下是CAN通信驱动开发的关键注意事项相关的整理,涵盖硬件配置、协议实现、错误处理及性能优化等方面: 一、硬件层配置要点 引脚复用与时钟 确认MCU的CAN控制器引脚是否与GPIO复用,正确配置复用模式。 检查CAN控制器时钟源,确保波特率计算基准准确。 收发器(Transceiver)…

CCF编程能力等级认证GESP—C++8级—20250628

CCF编程能力等级认证GESP—C8级—20250628单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)树上旅行遍历计数单选题&#xff08;每题 2 分&#xff0c;共 30…

135. Java 泛型 - 无界通配符

文章目录135. Java 泛型 - 无界通配符 (?)**1. 什么是无界通配符 (?)&#xff1f;****2. 为什么使用无界通配符&#xff1f;****3. 示例&#xff1a;使用 ? 处理任意列表****❌ 错误示例****✅ 正确示例****4. 为什么 List<Object> 和 List<?> 不一样&#xff…

NOIP提高组|2010T1机器翻译

NOIP2010年提高组第一题:机器翻译 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果…

Change Data Capture (CDC) with Kafka Connect:实时数据同步的完整指南

Change Data Capture (CDC) 是一种高效的数据同步技术&#xff0c;能够捕获数据库的变更&#xff08;插入、更新、删除&#xff09;并实时传输到其他系统。结合 Kafka Connect&#xff0c;我们可以构建一个可靠、可扩展的 CDC 管道&#xff0c;实现数据库与数据湖、数据仓库或消…

云手机网络加速全攻略:解决游戏卡顿与APP连接失败困扰

用云手机玩游戏、挂脚本、跑自动任务&#xff0c;明明后台显示在线&#xff0c;但画面卡顿、操作延迟、甚至APP直接“转圈圈连不上”&#xff0c;是不是很抓狂&#xff1f;问题出在哪里&#xff1f;云手机不卡&#xff0c;网络卡&#xff1f;其实&#xff0c;大多数云手机的性能…

从“数字土著”到“数据公民”:K-12数据伦理课程的设计、实施与成效追踪研究

一、引言 1.1 研究背景与意义 在当今数字时代&#xff0c;信息技术以前所未有的速度渗透到社会的各个领域&#xff0c;深刻地改变了人们的生活、工作和学习方式。K-12 教育作为基础教育的关键阶段&#xff0c;也在数字化浪潮的推动下发生着巨大的变革。随着大数据、人工智能…

LVS详解

LVS(Linux virtual server)简介即linux虚拟服务器四层负载均衡基本上都会使用 LVS&#xff0c;据了解 BAT 等大厂都是 LVS 重度使用者&#xff0c;就是因为 LVS 非常出色的性能&#xff0c;能为公司节省巨大的成本。LVS&#xff0c;全称 Linux Virtual Server 是由国人章文嵩博…

Linux内核设计与实现 - 第5章 系统调用

目录一、系统调用概述二、系统调用实现机制四、性能优化技术五、常见问题排查六、安全注意事项一、系统调用概述 定义 用户空间访问内核功能的唯一合法入口提供硬件抽象接口&#xff0c;保证系统稳定和安全 与API区别 特性系统调用API执行层级内核态用户态实现方式软中断(int …

纸板制造糊机操作

糊机操作技巧:开机流程&#xff1a;首先&#xff0c;一切的一切&#xff0c;要看懂生管&#xff0c;我们要用哪个楞别&#xff0c;再看哪个门幅和材质。 也就是说&#xff0c;一切的一切&#xff0c;要生产了&#xff0c;原纸不能用错了吧&#xff01; 第一步&#xff1a; 压压…

WPF 多窗口分文件实现方案

WPF 多窗口分文件实现方案 项目文件结构 WindowSwitcher/ ├── App.xaml ├── App.xaml.cs ├── MainWindow.xaml ├── MainWindow.xaml.cs ├── Views/ │ ├── SettingsWindow.xaml │ ├── SettingsWindow.xaml.cs │ ├── DataWindow.xaml │ ├─…

在服务器(ECS)部署 MySQL 操作流程

在部署 MySQL 数据库之前需要准备好服务器环境。可以通过以下两种方式来准备部署服务器&#xff1a;云服务器&#xff08;ECS&#xff09;&#xff0c;如&#xff1a;阿里云、华为云、腾讯云等。IDC服务器。 现以阿里云服务器&#xff08;ECS&#xff09;Windows版本来进行部署…

Java File 类详解:从基础操作到实战应用,掌握文件与目录处理全貌

作为一名 Java 开发工程师&#xff0c;你一定在实际开发中遇到过需要操作文件或目录的场景&#xff0c;例如&#xff1a;读写配置文件、上传下载、日志处理、文件遍历、路径管理等。Java 提供了 java.io.File 类来帮助开发者完成这些任务。本文将带你全面掌握&#xff1a;File …

嵌入式学习-PyTorch(9)-day25

进入尾声&#xff0c;一个完整的模型训练 &#xff0c;点亮的第一个led#自己注释版 import torch import torchvision.datasets from torch import nn from torch.utils.tensorboard import SummaryWriter import time # from model import * from torch.utils.data import Dat…

用AI做带货视频评论分析进阶提分【Datawhale AI 夏令营】

文章目录回顾赛题优化1️⃣优化2️⃣回顾赛题 模块内容类型说明/示例赛题背景概述参赛者需构建端到端评论分析系统&#xff0c;实现商品识别、多维情感分析、评论聚类与主题提炼三大任务。商品识别输入video_desc&#xff08;视频描述&#xff09; video_tags&#xff08;标签…

Redis常见数据结构详细介绍

Redis 作为一款高性能的开源内存数据库&#xff0c;凭借其丰富多样的数据结构和出色的性能&#xff0c;在缓存、会话存储、实时分析等众多场景中得到了广泛应用。下面将详细介绍 Redis 主要的数据结构&#xff0c;包括它们的类型、具体用法和适用场景。1、字符串&#xff08;St…

HAMR硬盘高温写入的可靠性问题

热辅助磁记录(HAMR)作为突破传统磁记录密度极限的下一代存储技术,其在数据中心大规模应用的核心挑战在于可靠性保障。 扩展阅读: 下一个存储战场:HAMR技术HDD HAMR技术进入云存储市场! 漫谈HAMR硬盘的可靠性 随着存储密度向4Tbpsi迈进,传统磁记录技术遭遇"三难困境…

使用llama-factory进行qwen3模型微调

运行环境 Linux 系统(ubuntu) Gpu (NVIDIA) 安装部署 llama factory CUDA 安装 首先,在 https://developer.nvidia.com/cuda-gpus 查看您的 GPU 是否支持CUDA 保证当前 Linux 版本支持CUDA. 在命令行中输入 uname -m && cat /etc/*release,应当看到类似的输出 x8…

tcp/udp调试工具

几款tcp/udp调试工具 下载地址&#xff1a;夸克网盘