彻底掌握Python集合:无序性、去重神器与高效集合运算指南

简介: 彻底掌握Python集合:无序性、去重神器与高效集合运算指南

Python 中的集合(set)是一种无序、可变且不重复的元素集合。集合常用于去重、数学集合运算(如并集、交集、差集等)以及其他需要唯一元素的场景。本文将详细介绍 Python 集合的基本语法、常用方法、示例代码、应用场景、注意事项及总结。

基本语法

创建集合

集合可以通过两种方式创建:使用花括号 {}set() 函数。

# 使用花括号创建集合
set1 = {1, 2, 3, 4}
print(set1)  # 输出: {1, 2, 3, 4}
# 使用 set() 函数创建集合
set2 = set([1, 2, 3, 4])
print(set2)  # 输出: {1, 2, 3, 4}
# 创建空集合只能用 set() 函数
empty_set = set()
print(empty_set)  # 输出: set()

常用方法

添加和删除元素
# 添加元素
set1.add(5)
print(set1)  # 输出: {1, 2, 3, 4, 5}
# 删除元素,如果元素不存在会引发 KeyError
set1.remove(3)
print(set1)  # 输出: {1, 2, 4, 5}
# 删除元素,如果元素不存在不会引发错误
set1.discard(3)
print(set1)  # 输出: {1, 2, 4, 5}
# 随机删除一个元素并返回
element = set1.pop()
print(element)  # 输出: 1 (结果可能不同)
print(set1)  # 输出: {2, 4, 5} (结果可能不同)
# 清空集合
set1.clear()
print(set1)  # 输出: set()
集合运算
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 并集
union_set = set1 | set2
print(union_set)  # 输出: {1, 2, 3, 4, 5}
# 交集
intersection_set = set1 & set2
print(intersection_set)  # 输出: {3}
# 差集
difference_set = set1 - set2
print(difference_set)  # 输出: {1, 2}
# 对称差集
symmetric_difference_set = set1 ^ set2
print(symmetric_difference_set)  # 输出: {1, 2, 4, 5}
其他方法
set1 = {1, 2, 3}
set2 = {2, 3}
# 判断子集
print(set2.issubset(set1))  # 输出: True
# 判断超集
print(set1.issuperset(set2))  # 输出: True
# 判断是否有交集
print(set1.isdisjoint(set({4, 5})))  # 输出: True
# 复制集合
set3 = set1.copy()
print(set3)  # 输出: {1, 2, 3}

示例

去除列表中的重复元素
my_list = [1, 2, 2, 3, 4, 4, 5]
my_set = set(my_list)
unique_list = list(my_set)
print(unique_list)  # 输出: [1, 2, 3, 4, 5]
集合运算示例
students_A = {"Tom", "Jerry", "Mike"}
students_B = {"Tom", "Mike", "Sara"}
# 两个班级的学生总数
all_students = students_A | students_B
print(all_students)  # 输出: {'Tom', 'Jerry', 'Mike', 'Sara'}
# 两个班级的共同学生
common_students = students_A & students_B
print(common_students)  # 输出: {'Tom', 'Mike'}
# 仅在 A 班级的学生
only_A_students = students_A - students_B
print(only_A_students)  # 输出: {'Jerry'}
# 不在共同的学生
unique_students = students_A ^ students_B
print(unique_students)  # 输出: {'Jerry', 'Sara'}

Python 集合的应用场景详解及示例

Python 集合是一种功能强大且高效的数据结构,适用于多个实际应用场景。下面详细介绍集合的四大主要应用场景,并附上示例代码。

1. 去重

集合的一个重要特性是它只能包含唯一的元素。这使得它成为从列表或其他可迭代对象中去除重复元素的理想工具。

示例代码:

# 原始列表包含重复元素
my_list = [1, 2, 2, 3, 4, 4, 5]
print("原始列表:", my_list)
# 使用集合去除重复元素
unique_set = set(my_list)
print("去重后的集合:", unique_set)
# 将集合转换回列表
unique_list = list(unique_set)
print("去重后的列表:", unique_list)

输出:

原始列表: [1, 2, 2, 3, 4, 4, 5]
去重后的集合: {1, 2, 3, 4, 5}
去重后的列表: [1, 2, 3, 4, 5]
2. 数学集合运算

集合支持多种数学集合运算,如并集、交集、差集和对称差集。这些运算非常适用于需要处理集合关系的场景。

示例代码:

set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 并集
union_set = set1 | set2
print("并集:", union_set)  # 输出: {1, 2, 3, 4, 5}
# 交集
intersection_set = set1 & set2
print("交集:", intersection_set)  # 输出: {3}
# 差集
difference_set = set1 - set2
print("差集:", difference_set)  # 输出: {1, 2}
# 对称差集
symmetric_difference_set = set1 ^ set2
print("对称差集:", symmetric_difference_set)  # 输出: {1, 2, 4, 5}

输出:

并集: {1, 2, 3, 4, 5}
交集: {3}
差集: {1, 2}
对称差集: {1, 2, 4, 5}
3. 元素查找

集合的查找操作时间复杂度为 O(1),这使得集合非常适用于需要快速查找元素的场景。

示例代码:

# 创建一个集合
my_set = {1, 2, 3, 4, 5}
# 查找元素是否在集合中
print(3 in my_set)  # 输出: True
print(6 in my_set)  # 输出: False

输出:

True
False
4. 集合关系判断

集合提供了丰富的方法来判断集合之间的关系,如子集、超集和是否有交集等。这在需要判断集合关系的场景中非常有用。

示例代码:

set1 = {1, 2, 3}
set2 = {2, 3}
# 判断子集
is_subset = set2.issubset(set1)
print("set2 是 set1 的子集:", is_subset)  # 输出: True
# 判断超集
is_superset = set1.issuperset(set2)
print("set1 是 set2 的超集:", is_superset)  # 输出: True
# 判断是否有交集
has_intersection = set1.isdisjoint({4, 5})
print("set1 与 {4, 5} 没有交集:", has_intersection)  # 输出: True

输出:

set2 是 set1 的子集: True
set1 是 set2 的超集: True
set1 与 {4, 5} 没有交集: True

Python 集合详解:不可变元素、无序性、性能考虑及使用可变集合的注意事项

Python 集合是一种强大的数据结构,具备高效的查找、插入和删除操作。为了充分利用集合的优势,并避免常见的陷阱和问题,需要了解以下几个关键点:集合元素的不可变性、集合的无序性、性能考虑及使用可变集合的注意事项。

1. 集合元素必须是不可变的

集合中的元素必须是可哈希的,即元素必须是不可变类型。常见的不可变类型包括整数、字符串和元组等。

示例代码:

# 可以作为集合元素的类型
immutable_set = {1, "hello", (2, 3)}
print("集合:", immutable_set)
# 尝试使用列表作为集合元素(会报错)
try:
    invalid_set = {1, [2, 3]}
except TypeError as e:
    print("错误:", e)

输出:

集合: {1, (2, 3), 'hello'}
错误: unhashable type: 'list'
2. 集合是无序的

集合不保证元素的顺序,因此不能依赖集合的顺序。如果需要有序集合,可以使用 collections.OrderedDict 来实现。

示例代码:

from collections import OrderedDict
# 集合是无序的
unordered_set = {3, 1, 2}
print("无序集合:", unordered_set)
# 使用 OrderedDict 实现有序集合
ordered_dict = OrderedDict.fromkeys([3, 1, 2])
ordered_set = set(ordered_dict.keys())
print("有序集合:", ordered_set)

输出:

无序集合: {1, 2, 3}
有序集合: {3, 1, 2}
3. 性能考虑

集合的查找、添加、删除操作的时间复杂度为 O(1),但在处理大量数据时,仍需注意内存消耗问题。

示例代码:

# 创建一个包含大量数据的集合
large_set = set(range(1000000))
# 查找操作
print("查找 999999:", 999999 in large_set)
# 添加操作
large_set.add(1000001)
print("添加元素后集合大小:", len(large_set))
# 删除操作
large_set.remove(500000)
print("删除元素后集合大小:", len(large_set))

输出:

查找 999999: True
添加元素后集合大小: 1000001
删除元素后集合大小: 1000000
4. 小心使用可变集合

普通集合是不可哈希的,不能作为其他集合的元素。如果需要在集合中包含集合,可以使用 frozenset,因为 frozenset 是不可变的,可以作为集合的元素。

示例代码:

# 尝试将普通集合作为元素(会报错)
try:
    invalid_nested_set = {frozenset({1, 2}), {3, 4}}
except TypeError as e:
    print("错误:", e)
# 使用 frozenset 作为元素
valid_nested_set = {frozenset({1, 2}), frozenset({3, 4})}
print("包含 frozenset 的集合:", valid_nested_set)

输出:

错误: unhashable type: 'set'
包含 frozenset 的集合: {frozenset({3, 4}), frozenset({1, 2})}

总结

Python 集合是一种非常有用的数据结构,具有无序、可变、去重的特点,适用于需要集合运算和唯一性判断的场景。通过理解和掌握集合的基本语法和常用方法,可以有效地进行数据处理和性能优化。在实际应用中,需要注意集合的不可变性和性能问题,合理使用集合的特性来解决实际问题。

相关文章
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
265 0
|
2月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
423 0
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
168 0
|
3月前
|
存储 JSON 算法
Python集合:高效处理无序唯一数据的利器
Python集合是一种高效的数据结构,具备自动去重、快速成员检测和无序性等特点,适用于数据去重、集合运算和性能优化等场景。本文通过实例详解其用法与技巧。
138 0
|
4月前
|
存储 索引 Python
python 集合的所有基础知识
python 集合的所有基础知识
203 0
|
2月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
169 4
|
8月前
|
数据采集 NoSQL 关系型数据库
Python爬虫去重策略:增量爬取与历史数据比对
Python爬虫去重策略:增量爬取与历史数据比对
|
3月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
361 2
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
536 1
思科设备巡检命令Python脚本大集合
|
7月前
|
数据采集 存储 NoSQL
分布式爬虫去重:Python + Redis实现高效URL去重
分布式爬虫去重:Python + Redis实现高效URL去重

推荐镜像

更多