让 AI 写 set 新的学习资料 - 先学这个

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


  1. set 的定义与创建、特点知识点

    1. 合集的定义与创建

      • 直接用花括号:使用 {元素1, 元素2, ...}​ 可创建集合,集合自动去重。但创建空集合不能用 {}​,要用 set()​,因为 {}​ 表示空字典。
      • 使用 set()函数:传入可迭代对象(如列表、元组、字符串、字典)可创建集合。从字典创建时集合包含字典的键。
    2. 特点

      • 元素唯一性:添加重复元素时,Python 自动忽略,只保留一个。常用于数据去重,如去除用户邮箱列表中的重复项。
      • 无序性:集合元素无固定顺序,输出和遍历顺序不定。内部用哈希表存储,侧重快速查找和插入,不维护元素顺序,不支持索引访问。
  2. 集合常和操作知识点

    1. 添加元素

      • 方法:使用 add()​ 方法添加单个元素。
      • 示例my_set = {1, 2, 3}​,my_set.add(4)​ 使集合变为 {1, 2, 3, 4}​。
      • 特性:添加已存在元素时,不报错且不重复添加,如 my_set.add(3)​ 集合不变。
    2. 删除元素

      • remove()方法

        • 功能:删除指定元素。
        • 示例my_set.remove(2)​ 可将 {1, 2, 3}​ 变为 {1, 3}​。
        • 风险:删除不存在元素会引发 KeyError​,如 my_set.remove(4)​。
        • 建议:用 in​ 判断元素存在性,避免出错。
      • discard()方法

        • 功能:删除指定元素。
        • 优势:删除不存在元素不报错,集合不变。
        • 示例my_set.discard(4)​ 后 {1, 2, 3}​ 集合不变。
        • 适用场景:不确定元素是否存在时使用更安全。
  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}

    总结说明

    • 并集:把俩集合元素放一块,重复的只留一个。
    • 交集:俩集合都有的元素。
    • 差集:一个集合有但另一个没有的元素。
    • 对称差集:只在一个集合里有的元素。

    版本一:简洁押韵型

    并集合并去重单,
    交集共元聚一团。
    差集己有他集无,
    对称差取异处安。

    解释:

    • “并集合并去重单”:明确指出并集是将两个集合合并,同时去除重复元素,“单” 体现去重后元素的唯一性。
    • “交集共元聚一团”:说明交集是把两个集合中共同的元素聚集在一起。
    • “差集己有他集无”:强调差集是找出当前集合有而另一个集合没有的元素。
    • “对称差取异处安”:表示对称差集是选取两个集合中不同的、不重叠的部分元素构成新集合。

    版本二:强调操作型

    并集相加去重留,
    交集同数一起收。
    差集我有你没有,
    对称差取单边求。

    解释:

    • “并集相加去重留”:形象地把并集操作比喻成两个集合元素相加,然后留下不重复的元素。
    • “交集同数一起收”:突出交集是收集两个集合中相同的元素。
    • “差集我有你没有”:直白地说明了差集是当前集合特有的元素。
    • “对称差取单边求”:表明对称差集是取只在一个集合中出现的元素来求解。
  4. 集合运算知识点

    1. 集合运算

      • 并集

        • 定义:包含两个集合所有不重复元素的集合。
        • 获取方式:使用 |​ 运算符(如 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}​。
    2. 遍历

      • 方式:使用 for​ 循环遍历集合元素,如 for element in my_set: print(element)​。
      • 特点:因集合无序,遍历顺序不确定。
      • 处理方法:若需特定顺序处理元素,可先将集合转列表再排序。
  5. 集合应用场景知识点

    1. 去重

      • 方法:将列表转换为集合,利用集合元素唯一性去重,再转换回列表。
      • 示例my_list = [1, 2, 2, 3, 3, 3]​,通过 list(set(my_list))​ 得到去重后的列表 [1, 2, 3]​。
    2. 关系运算

      • 判断元素是否在集合中

        • 方法:使用 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​。
        • 应用场景:可用于权限管理中判断用户组的权限子集关系。
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    548 引用 • 674 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...