讲师中心 微信公众号
AI工具推荐 视频效率加速

Python怎么创建一个集合(set)_Python集合创建与使用详解

云明同学_6691

云明同学_6691

发布时间:2025-09-16 19:47:01

|

471人浏览过

|

来源于php中文网

原创

创建集合推荐使用set()构造函数,因{}会创建字典;集合具唯一性、无序性、元素需不可变,适用于去重、成员检测及集合运算。

python怎么创建一个集合(set)_python集合创建与使用详解

在Python中,创建一个集合(set)主要有两种方式:使用花括号

{}
直接定义,或者通过
set()
构造函数。这两种方法各有侧重,理解它们的区别是高效使用集合的关键。

解决方案

要创建一个Python集合,最直观的方式是使用花括号

{}
,并将元素用逗号分隔。但这里有个小陷阱,如果你想创建一个空集合,
{}
实际上会创建一个空字典,而不是空集合。正确的空集合创建方式是使用
set()
构造函数。

举个例子:

# 方法一:使用花括号 {} 创建非空集合
my_set = {1, 2, 3, 'apple', 'banana'}
print(f"通过花括号创建的集合: {my_set}")
print(f"类型: {type(my_set)}")

# 错误示范:创建一个空字典,而非空集合
empty_dict = {}
print(f"通过花括号创建的空集合(实际是字典): {empty_dict}")
print(f"类型: {type(empty_dict)}")

# 方法二:使用 set() 构造函数创建集合
# 创建空集合
empty_set = set()
print(f"通过 set() 创建的空集合: {empty_set}")
print(f"类型: {type(empty_set)}")

# 从列表创建集合(会自动去重)
list_data = [1, 2, 2, 3, 'apple', 'apple', 'orange']
set_from_list = set(list_data)
print(f"从列表创建的集合: {set_from_list}")

# 从元组创建集合
tuple_data = (10, 20, 20, 30)
set_from_tuple = set(tuple_data)
print(f"从元组创建的集合: {set_from_tuple}")

# 从字符串创建集合(会把每个字符作为一个元素,并去重)
string_data = "hello"
set_from_string = set(string_data)
print(f"从字符串创建的集合: {set_from_string}") # 结果可能是 {'o', 'l', 'e', 'h'},顺序不确定

可以看到,

set()
构造函数非常灵活,可以接受任何可迭代对象(如列表、元组、字符串、range对象等)作为参数,并将其中的元素转换为集合的元素。这个过程中,它会自动处理重复项,确保集合中每个元素都是唯一的。

立即学习“Python免费学习笔记(深入)”;

Python集合有哪些核心特性和应用场景?

集合(set)在Python中是一个非常独特的数据结构,它不像列表或元组那样简单。我个人觉得,理解它的核心特性,是掌握它强大之处的关键。

首先,也是最重要的一个特性,就是元素唯一性。集合会自动排除重复的元素。当你需要处理一个数据集,并且只关心其中不重复的值时,集合简直是“神器”。比如,我以前在处理用户ID日志时,经常会遇到大量重复的ID,如果想快速统计有多少独立用户,把所有ID扔进一个集合,瞬间就能得到结果,效率比循环判断快得多。

其次,集合是无序的。这意味着你不能通过索引来访问集合中的元素,比如

my_set[0]
这种操作是不被允许的。集合内部的存储方式决定了它不关心元素的排列顺序,这有时会让初学者感到困惑,但正是这种无序性,使得集合在查找、插入和删除操作上表现出惊人的效率(通常是O(1)的平均时间复杂度)。

再者,集合中的元素必须是不可变对象。你可以把数字、字符串、元组放进集合,但不能直接把列表、字典或另一个集合放进去,因为它们是可变的。如果你尝试这样做,Python会报错。这个限制其实是为了保证集合内部哈希(hash)机制的正常运作,确保元素的唯一性和快速查找。当然,如果你非要存一个可变对象,可以考虑将可变对象转换为不可变形式(比如将列表转换为元组),但这通常意味着你可能需要重新审视你的数据结构设计。

至于应用场景,那真是五花八门:

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载
  • 去重:这是最常见的用途,无论数据来自文件、数据库还是网络,集合都能高效完成。
  • 成员资格测试:判断一个元素是否在集合中,速度极快。比如,检查一个单词是否在某个词汇表中,比遍历列表要快得多。
  • 数学集合操作:并集、交集、差集、对称差集,这些在数据分析和算法中非常有用。比如,找出两个用户群体的共同偏好(交集),或者找出某个群体独有的特征(差集)。
  • 消除冗余数据:在处理配置项、权限列表等场景时,集合能确保每个项都是唯一的。

我曾经用集合来优化一个推荐系统的数据预处理环节,通过集合的快速去重和交集操作,显著提升了数据清洗的效率,这比我最初用循环和条件判断要简洁和高效得多。

除了创建,我们还能对Python集合进行哪些常用操作?

创建集合只是第一步,真正让集合发挥作用的是它提供的各种操作方法。这些方法让我们可以方便地处理集合间的关系,以及对集合内部元素进行增删改查。

# 示例集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
set3 = {1, 2}

print(f"原始集合1: {set1}")
print(f"原始集合2: {set2}")
print(f"原始集合3: {set3}\n")

# 1. 添加元素
# add() 方法用于添加单个元素
set1.add(6)
set1.add(1) # 添加已存在的元素不会有任何效果
print(f"添加元素后的集合1: {set1}") # 结果是 {1, 2, 3, 4, 5, 6}

# update() 方法用于添加多个元素(可以是列表、元组、另一个集合等)
set1.update([7, 8], {9, 10})
print(f"更新元素后的集合1: {set1}\n") # 结果是 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

# 2. 删除元素
# remove() 方法:删除指定元素,如果元素不存在会报错 KeyError
try:
    set1.remove(10)
    print(f"删除元素10后的集合1: {set1}")
    # set1.remove(100) # 尝试删除不存在的元素会报错
except KeyError:
    print("尝试删除不存在的元素引发了 KeyError\n")

# discard() 方法:删除指定元素,如果元素不存在不会报错
set1.discard(9)
set1.discard(100) # 删除不存在的元素不会报错
print(f"删除元素9后的集合1: {set1}")

# pop() 方法:随机删除并返回一个元素,空集合调用会报错 KeyError
try:
    popped_element = set1.pop()
    print(f"弹出的元素: {popped_element}, 剩余集合1: {set1}")
except KeyError:
    print("尝试从空集合弹出元素引发了 KeyError\n")

# clear() 方法:清空集合
temp_set = {1, 2, 3}
temp_set.clear()
print(f"清空后的集合: {temp_set}\n")

# 3. 集合运算(数学集合操作)
# 并集 (Union):union() 方法或 | 运算符
union_set = set1.union(set2)
# union_set = set1 | set2
print(f"集合1和集合2的并集: {union_set}")

# 交集 (Intersection):intersection() 方法或 & 运算符
intersection_set = set1.intersection(set2)
# intersection_set = set1 & set2
print(f"集合1和集合2的交集: {intersection_set}")

# 差集 (Difference):difference() 方法或 - 运算符
difference_set = set1.difference(set2) # 集合1中有但集合2中没有的元素
# difference_set = set1 - set2
print(f"集合1和集合2的差集 (set1 - set2): {difference_set}")

# 对称差集 (Symmetric Difference):symmetric_difference() 方法或 ^ 运算符
symmetric_difference_set = set1.symmetric_difference(set2) # 两个集合中独有的元素
# symmetric_difference_set = set1 ^ set2
print(f"集合1和集合2的对称差集: {symmetric_difference_set}\n")

# 4. 子集与超集判断
# issubset() 方法:判断一个集合是否是另一个集合的子集
print(f"集合3是集合1的子集吗? {set3.issubset(set1)}") # True
print(f"集合1是集合3的子集吗? {set1.issubset(set3)}") # False

# issuperset() 方法:判断一个集合是否是另一个集合的超集
print(f"集合1是集合3的超集吗? {set1.issuperset(set3)}") # True
print(f"集合3是集合1的超集吗? {set3.issuperset(set1)}") # False

# isdisjoint() 方法:判断两个集合是否没有共同元素(不相交)
disjoint_set = {100, 200}
print(f"集合1和 {disjoint_set} 不相交吗? {set1.isdisjoint(disjoint_set)}") # True
print(f"集合1和集合2不相交吗? {set1.isdisjoint(set2)}") # False

这些操作,尤其是集合运算,在处理数据关系时非常强大。比如,我曾经需要找出两个用户组中既不重叠,又不是完全包含关系的用户,对称差集就完美解决了这个问题。使用这些内置方法,代码不仅更简洁,而且通常比手动循环判断要高效得多。

在实际开发中,什么时候选择使用集合(set)而不是列表或元组?

这是一个很实际的问题,也是我经常在代码审查时会关注的地方。选择合适的数据结构,能让你的代码更高效、更易读。

最核心的考量点,我觉得在于你对元素唯一性和查找效率的需求。

如果你需要一个容器来存储一系列元素,并且:

  1. 不关心元素的顺序。
  2. 确保所有元素都是唯一的。
  3. 需要频繁地检查某个元素是否存在(成员资格测试)。
  4. 需要进行数学上的集合运算(并集、交集、差集等)。

那么,集合(set)就是你的首选。它的内部实现(哈希表)使得成员资格测试的平均时间复杂度是 O(1),这意味着无论集合有多大,查找一个元素的速度都非常快。这与列表(list)的 O(n) 查找速度形成了鲜明对比,当列表非常大时,查找效率会显著下降。

举个例子: 假设你正在开发一个用户权限管理系统,每个用户可能有多个角色,每个角色又包含多个权限。你需要快速判断一个用户是否拥有某个特定权限。

  • 如果你用列表来存储权限,每次判断都需要遍历列表,效率低下。
  • 但如果将用户的权限存储在一个集合中,
    'admin_permission' in user_permissions_set
    这样的操作几乎是瞬时的。

再比如,在数据清洗阶段,我经常会从不同的数据源获取用户ID。如果我需要统计所有不重复的用户ID,把它们全部放到一个列表中,然后手动去重(比如用循环加条件判断),那会非常慢且容易出错。但如果直接扔进一个集合,重复的ID会自动被忽略,最终集合里就是所有不重复的ID。

相比之下:

  • 列表(list):当你需要一个有序的元素序列,且元素可以重复,并且经常需要通过索引访问元素时,列表是最佳选择。
  • 元组(tuple):当你需要一个有序且不可变的元素序列时,元组是理想选择。它通常用于表示固定大小、不可更改的数据集,例如坐标点
    (x, y)
    。

所以,选择哪种数据结构,真的取决于你的具体需求。没有绝对的好坏,只有是否适合当前场景。在我的经验里,很多人习惯性地用列表,但在很多需要去重或快速查找的场景,切换到集合会带来意想不到的性能提升和代码简化。这种思维上的转变,往往是写出更优雅、更高效Python代码的关键一步。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2684

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6064

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7314

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

10654

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

5459

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

5907

2025.08.07

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn