Python 中 set
(集合)的全面解析
在 Python 编程的世界里,set
(集合)是一种功能丰富且极为实用的内置数据类型 ,它专门用于存储一系列不重复的元素,这种独特的特性让 set
在诸多编程场景中都能发挥出关键作用
定义与创建
1. 直接使用花括号
可以利用花括号 {}
来创建一个 set
,将不同的元素用逗号分隔开放在花括号内。例如:
my_set = {1, 2, 3} # 创建一个包含整数1、2、3的集合
print(my_set) # 输出集合my_set,输出结果为{1, 2, 3}
在这段代码中,my_set
被定义为一个集合对象,其中包含了三个整数元素。集合具有自动去重的功能,哪怕你在初始化集合时写入了重复元素,最终也只会保留一个。不过,有一点需要特别留意,当你想要创建一个空集合时,不能直接使用 {}
,因为在 Python 的语法规则里,{}
会被解析为创建一个空字典,而并非空集合。如果要创建空集合,应该使用 set()
函数,如下所示:
empty_set = set() # 使用set()函数创建一个空集合
print(empty_set) # 输出空集合,输出结果为set()
2. 使用 set()
函数
通过 set()
函数并传入可迭代对象,就能够创建出一个集合。可迭代对象指的是那些能够逐个提供元素的对象,常见的有列表、元组、字符串、字典等。
例如,从列表创建集合:
my_list = [1, 2, 3, 3] # 定义一个包含重复元素的列表,列表中元素3出现了两次
my_set = set(my_list) # 使用set()函数将列表转换为集合,由于集合元素的唯一性,重复元素3在集合中只会保留一个
print(my_set) # 输出转换后的集合,输出结果为{1, 2, 3}
从字符串创建集合:
my_string = 'hello,领导好,大家好啊!!' # 定义一个字符串
char_set = set(my_string) # 使用set()函数将字符串转换为集合,集合中的元素为字符串中的不同字符
print(char_set) # 输出转换后的集合,由于集合的无序性,输出结果可能是{'h', 'e', 'l', 'o'} 等不同顺序的组合
从字典创建集合时,集合会包含字典的键(因为字典的键是唯一的):
my_dict = {'a': 1, 'b': 2, 'c': 3} # 定义一个字典
key_set = set(my_dict) # 使用set()函数将字典转换为集合,集合中包含字典的键
print(key_set) # 输出转换后的集合,输出结果可能是{'a', 'b', 'c'} 等不同顺序的组合
集合的特点
1. 元素唯一性
set
的核心特性就是其元素的唯一性。当向集合中添加重复元素时,Python 会自动忽略这些重复值,只保留一个。例如:
my_set = {1, 2, 2, 3} # 创建一个包含重复元素的集合,其中元素2重复出现
print(my_set) # 输出集合,重复元素2只会保留一个,输出结果为{1, 2, 3}
这一特性在数据处理领域尤为重要,比如在处理大量数据时,常常需要快速去除重复记录,使用集合可以轻松达成这一目标。以处理用户注册信息为例,假设存在一个包含大量用户邮箱地址的列表,其中可能存在重复的邮箱地址,通过将该列表转换为集合,就能方便快捷地去除重复的邮箱地址,保证数据的唯一性。
2. 无序性
set
中的元素没有固定的顺序。这意味着每次输出集合或者遍历集合时,元素的顺序都可能不同。例如:
my_set = {1, 2, 3} # 创建一个集合
print(my_set) # 输出集合,每次运行结果的顺序可能不同,可能是{1, 2, 3},也可能是{3, 1, 2}等其他顺序
这是因为集合在内部是使用哈希表来存储元素的,这种存储方式主要侧重于快速查找和插入操作,而并非维护元素的顺序。与列表(list
)和元组(tuple
)等有序数据类型形成了鲜明的对比。列表和元组中的元素按照定义的顺序存储,通过索引可以准确地访问到特定位置的元素;而集合中的元素则无法通过索引来访问,只能通过遍历或者判断元素是否存在于集合中来操作。
set 的定义与创建、特点知识点1
集合常用操作
1. 添加元素
使用 add()
方法向集合中添加单个元素。例如:
my_set = {1, 2, 3,'中文','abc'} # 创建一个集合
my_set.add(4) # 使用add()方法向集合中添加元素4
print(my_set) # 输出添加元素后的集合,输出结果为{1, 2, 3, 4}
这里 add(4)
将整数 4
添加到了 my_set
集合中 。如果添加的元素已经存在于集合中,add()
方法不会引发错误,只是不会重复添加。例如:
my_set = {1, 2, 3} # 创建一个集合
my_set.add(3) # 尝试向集合中添加已经存在的元素3
print(my_set) # 输出集合,集合内容不变,仍为{1, 2, 3}
2. 删除元素
remove()
方法
用于删除指定元素。例如:
my_set = {1, 2, 3} # 创建一个集合
my_set.remove(2) # 使用remove()方法从集合中删除元素2
print(my_set) # 输出删除元素后的集合,输出结果为{1, 3}
上述代码中,remove(2)
成功从 my_set
集合中删除了元素 2
。但是,如果尝试删除集合中不存在的元素,remove()
方法会引发 KeyError
错误。例如:
my_set = {1, 2, 3} # 创建一个集合
my_set.remove(4) # 尝试删除集合中不存在的元素4,会引发KeyError错误
print(my_set)
运行这段代码会报错,提示 KeyError: 4
,这是因为 4
并不在 my_set
集合中。所以在使用 remove()
方法时,最好先通过 in
关键字判断元素是否存在于集合中,以避免程序出错。
discard()
方法
同样用于删除元素,但与 remove()
方法不同的是,当要删除的元素不存在时,discard()
方法不会报错。例如:
my_set = {1, 2, 3} # 创建一个集合
my_set.discard(4) # 使用discard()方法尝试删除集合中不存在的元素4,不会引发错误
print(my_set) # 输出集合,集合保持不变,仍为{1, 2, 3}
这里即使 4
不在 my_set
集合中,discard(4)
也不会引发错误,my_set
集合保持不变。这使得 discard()
方法在不确定元素是否存在于集合中时使用更加安全。
集合常用操作知识点2
3. 集合运算 集合运算表格3
并集
并集是指包含两个集合中所有不重复元素的集合。可以使用 |
运算符或 union()
方法来获取两个集合的并集。例如:
set1 = {1, 2, 3} # 创建集合set1
set2 = {3, 4, 5} # 创建集合set2
union_set = set1 | set2 # 使用|运算符获取set1和set2的并集
print(union_set) # 输出并集结果,结果为{1, 2, 3, 4, 5}
union_set_using_method = set1.union(set2) # 使用union()方法获取set1和set2的并集
print(union_set_using_method) # 输出并集结果,结果同样为{1, 2, 3, 4, 5}
在这段代码中,union_set
通过 |
运算符获取了 set1
和 set2
的并集,union_set_using_method
通过 union()
方法获取了同样的并集,两种方式的结果都包含了 set1
和 set2
中的所有不重复元素。
交集
交集是指两个集合中共同拥有的元素组成的集合。可以使用 &
运算符或 intersection()
方法来获取交集。例如:
set1 = {1, 2, 3} # 创建集合set1
set2 = {3, 4, 5} # 创建集合set2
intersection_set = set1 & set2 # 使用&运算符获取set1和set2的交集
print(intersection_set) # 输出交集结果,结果为{3}
intersection_set_using_method = set1.intersection(set2) # 使用intersection()方法获取set1和set2的交集
print(intersection_set_using_method) # 输出交集结果,结果同样为{3}
这里 intersection_set
和 intersection_set_using_method
都表示 set1
和 set2
的交集,结果为 {3}
,即两个集合中共同的元素。
差集
差集是指在一个集合中但不在另一个集合中的元素组成的集合。可以使用 -
运算符或 difference()
方法来获取差集。例如:
set1 = {1, 2, 3} # 创建集合set1
set2 = {3, 4, 5} # 创建集合set2
difference_set = set1 - set2 # 使用-运算符获取set1相对于set2的差集
print(difference_set) # 输出差集结果,结果为{1, 2}
difference_set_using_method = set1.difference(set2) # 使用difference()方法获取set1相对于set2的差集
print(difference_set_using_method) # 输出差集结果,结果同样为{1, 2}
这里 difference_set
和 difference_set_using_method
都表示 set1
相对于 set2
的差集,结果为 {1, 2}
,即存在于 set1
但不存在于 set2
的元素。
对称差集
对称差集是指只属于其中一个集合,而不同时属于两个集合的元素组成的集合。可以使用 ^
运算符或 symmetric_difference()
方法来获取对称差集。例如:
set1 = {1, 2, 3} # 创建集合set1
set2 = {3, 4, 5} # 创建集合set2
symmetric_difference_set = set1 ^ set2 # 使用^运算符获取set1和set2的对称差集
print(symmetric_difference_set) # 输出对称差集结果,结果为{1, 2, 4, 5}
symmetric_difference_set_using_method = set1.symmetric_difference(set2) # 使用symmetric_difference()方法获取set1和set2的对称差集
print(symmetric_difference_set_using_method) # 输出对称差集结果,结果同样为{1, 2, 4, 5}
这里 symmetric_difference_set
和 symmetric_difference_set_using_method
都表示 set1
和 set2
的对称差集,结果包含了只在 set1
或只在 set2
中的元素。
遍历
可以使用 for
循环来遍历 set
中的元素。例如:
my_set = {1, 2, 3, 4} # 创建一个集合
for element in my_set: # 使用for循环遍历集合中的每个元素
print(element) # 输出每个元素,由于集合的无序性,输出顺序可能不同
由于集合的无序性,遍历的顺序是不确定的。每次运行这段代码,元素的输出顺序可能不同。在实际应用中,如果需要按照特定顺序处理集合中的元素,可以先将集合转换为列表,然后对列表进行排序操作。
集合运算知识点4
集合应用场景
1. 去重
在数据处理中,经常需要去除列表等数据结构中的重复元素。可以先将列表转换为集合,利用集合的元素唯一性去除重复,然后再转换回列表。例如:
my_list = [1, 2, 2, 3, 3, 3] # 定义一个包含重复元素的列表
unique_list = list(set(my_list)) # 先将列表转换为集合去重,再转换回列表
print(unique_list) # 输出去重后的列表,结果为[1, 2, 3]
这里 set(my_list)
将列表 my_list
转换为集合,利用集合的元素唯一性去除了重复元素,然后 list()
函数再将集合转换回列表,最终得到去重后的列表 [1, 2, 3]
。
2. 关系运算
判断元素是否在集合中
可以使用 in
关键字快速判断一个元素是否在集合中。例如:
my_set = {1, 2, 3} # 创建一个集合
print(2 in my_set) # 判断元素2是否在集合中,返回True,因为2在集合中
print(4 in my_set) # 判断元素4是否在集合中,返回False,因为4不在集合中
这种判断操作的时间复杂度在平均情况下为O(1),效率很高。这是因为集合内部使用哈希表存储元素,通过哈希值可以快速定位元素是否存在。
求两个集合的公共元素
利用交集运算可以快速找出两个集合中共同的元素。例如,在处理用户权限管理时,可能有两个用户组,需要找出同时属于这两个用户组的用户,就可以使用集合的交集运算。假设 group1
和 group2
分别表示两个用户组的集合,通过 group1 & group2
就能得到同时属于这两个组的用户集合。
判断集合的包含关系
可以使用 issubset()
方法判断一个集合是否是另一个集合的子集,使用 issuperset()
方法判断一个集合是否是另一个集合的超集。例如:
subset = {1, 2} # 创建一个集合subset
superset = {1, 2, 3} # 创建一个集合superset
print(subset.issubset(superset)) # 判断subset是否是superset的子集,返回True
print(superset.issuperset(subset)) # 判断superset是否是subset的超集,返回True
在上述代码中,subset
是 superset
的子集,superset
是 subset
的超集。这在一些场景下非常有用,比如在权限管理中判断某个用户组是否具有特定的权限子集。
通过以上详细的介绍,希望你能全面深入地理解 Python 中 set
数据类型及其应用。无论是在数据处理、算法实现还是其他编程场景中,合理运用 set
都能帮助你更高效地解决问题,提升编程效率和代码质量。
集合应用场景知识点5
set 的定义与创建、特点知识点
-
合集的定义与创建
- 直接用花括号:使用
{元素1, 元素2, ...}
可创建集合,集合自动去重。但创建空集合不能用{}
,要用set()
,因为{}
表示空字典。 - 使用
set()
函数:传入可迭代对象(如列表、元组、字符串、字典)可创建集合。从字典创建时集合包含字典的键。
- 直接用花括号:使用
-
特点
- 元素唯一性:添加重复元素时,Python 自动忽略,只保留一个。常用于数据去重,如去除用户邮箱列表中的重复项。
- 无序性:集合元素无固定顺序,输出和遍历顺序不定。内部用哈希表存储,侧重快速查找和插入,不维护元素顺序,不支持索引访问。
-
↩
-
集合常和操作知识点
-
添加元素
- 方法:使用
add()
方法添加单个元素。 - 示例:
my_set = {1, 2, 3}
,my_set.add(4)
使集合变为{1, 2, 3, 4}
。 - 特性:添加已存在元素时,不报错且不重复添加,如
my_set.add(3)
集合不变。
- 方法:使用
-
删除元素
-
remove()
方法- 功能:删除指定元素。
- 示例:
my_set.remove(2)
可将{1, 2, 3}
变为{1, 3}
。 - 风险:删除不存在元素会引发
KeyError
,如my_set.remove(4)
。 - 建议:用
in
判断元素存在性,避免出错。
-
discard()
方法- 功能:删除指定元素。
- 优势:删除不存在元素不报错,集合不变。
- 示例:
my_set.discard(4)
后{1, 2, 3}
集合不变。 - 适用场景:不确定元素是否存在时使用更安全。 ↩
-
-
集合运算表格
操作方法 描述 数学表示 功能解释 示例(假设 A = {1, 2, 3},B = {3, 4, 5}) 结果 union()
返回当前集合与其他集合的并集 (A \cup B) 合并两个集合中的所有元素,重复元素只保留一个,形成一个新集合。 A.union(B)
{1, 2, 3, 4, 5}
intersection()
返回当前集合与其他集合的交集 (A \cap B) 找出两个集合中共同拥有的元素,组成一个新集合。 A.intersection(B)
{3}
difference()
返回当前集合与其他集合的差集 (A - B) 找出只存在于当前集合中,而不在其他集合中的元素,组成一个新集合。 A.difference(B)
{1, 2}
symmetric_difference()
返回当前集合与其他集合的对称差集 (A \triangle B=(A - B)\cup(B - A)) 找出只在其中一个集合中出现,不同时出现在两个集合中的元素,组成一个新集合。 A.symmetric_difference(B)
{1, 2, 4, 5}
总结说明
- 并集:把俩集合元素放一块,重复的只留一个。
- 交集:俩集合都有的元素。
- 差集:一个集合有但另一个没有的元素。
- 对称差集:只在一个集合里有的元素。
版本一:简洁押韵型
并集合并去重单,
交集共元聚一团。
差集己有他集无,
对称差取异处安。解释:
- “并集合并去重单”:明确指出并集是将两个集合合并,同时去除重复元素,“单” 体现去重后元素的唯一性。
- “交集共元聚一团”:说明交集是把两个集合中共同的元素聚集在一起。
- “差集己有他集无”:强调差集是找出当前集合有而另一个集合没有的元素。
- “对称差取异处安”:表示对称差集是选取两个集合中不同的、不重叠的部分元素构成新集合。
版本二:强调操作型
并集相加去重留,
交集同数一起收。
差集我有你没有,
对称差取单边求。解释:
- “并集相加去重留”:形象地把并集操作比喻成两个集合元素相加,然后留下不重复的元素。
- “交集同数一起收”:突出交集是收集两个集合中相同的元素。
- “差集我有你没有”:直白地说明了差集是当前集合特有的元素。
- “对称差取单边求”:表明对称差集是取只在一个集合中出现的元素来求解。 ↩
集合运算知识点
-
集合运算
-
并集
- 定义:包含两个集合所有不重复元素的集合。
- 获取方式:使用
|
运算符(如set1 | set2
)或union()
方法(如set1.union(set2)
)。 - 示例:
set1 = {1, 2, 3}
,set2 = {3, 4, 5}
,并集为{1, 2, 3, 4, 5}
。
-
交集
- 定义:由两个集合共同拥有元素组成的集合。
- 获取方式:使用
&
运算符(如set1 & set2
)或intersection()
方法(如set1.intersection(set2)
)。 - 示例:
set1 = {1, 2, 3}
,set2 = {3, 4, 5}
,交集为{3}
。
-
差集
- 定义:在一个集合中但不在另一个集合的元素组成的集合。
- 获取方式:使用
-
运算符(如set1 - set2
)或difference()
方法(如set1.difference(set2)
)。 - 示例:
set1 = {1, 2, 3}
,set2 = {3, 4, 5}
,差集为{1, 2}
。
-
对称差集
- 定义:只属于其中一个集合,不同时属于两个集合的元素组成的集合。
- 获取方式:使用
^
运算符(如set1 ^ set2
)或symmetric_difference()
方法(如set1.symmetric_difference(set2)
)。 - 示例:
set1 = {1, 2, 3}
,set2 = {3, 4, 5}
,对称差集为{1, 2, 4, 5}
。
-
-
遍历
- 方式:使用
for
循环遍历集合元素,如for element in my_set: print(element)
。 - 特点:因集合无序,遍历顺序不确定。
- 处理方法:若需特定顺序处理元素,可先将集合转列表再排序。 ↩
- 方式:使用
-
集合应用场景知识点
-
去重
- 方法:将列表转换为集合,利用集合元素唯一性去重,再转换回列表。
- 示例:
my_list = [1, 2, 2, 3, 3, 3]
,通过list(set(my_list))
得到去重后的列表[1, 2, 3]
。
-
关系运算
-
判断元素是否在集合中
- 方法:使用
in
关键字。 - 示例:
my_set = {1, 2, 3}
,2 in my_set
返回True
,4 in my_set
返回False
。 - 效率:平均时间复杂度为 O(1),因集合用哈希表存储元素,可通过哈希值快速定位。
- 方法:使用
-
求两个集合的公共元素
- 方法:利用交集运算(如
&
运算符)。 - 示例:在用户权限管理中,用
group1 & group2
找出同时属于两个用户组的用户。
- 方法:利用交集运算(如
-
判断集合的包含关系
- 方法:使用
issubset()
判断子集,issuperset()
判断超集。 - 示例:
subset = {1, 2}
,superset = {1, 2, 3}
,subset.issubset(superset)
和superset.issuperset(subset)
均返回True
。 - 应用场景:可用于权限管理中判断用户组的权限子集关系。 ↩
- 方法:使用
-
-
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于