【Python】set集合详解 矫情吗;* 2022-10-12 01:02 179阅读 0赞 ### set集合详解 ### * 概述 * 创建 set集合(2种) * * 1) 使用 \{\} 创建 * 2) set()函数创建集合 * 访问set集合元素 * 删除set集合 * set集合中添加元素 * set集合中删除元素 * set集合做交集、并集、差集运算 * set集合方法详解 # 概述 # Python 中的集合,和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。 从形式上看,和字典类似,Python 集合会将所有元素放在一对大括号 `{}` 中,相邻元素之间用`“,”`分隔,如下所示: { element1, element2, ..., elementn} 其中,elementn 表示集合中的元素,个数没有限制。 同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,`无法存储`列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 `TypeError 错误`。比如说: >>> { { 'a':1}} Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> { { 'a':1}} TypeError: unhashable type: 'dict' >>> { [1,2,3]} Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> { [1,2,3]} TypeError: unhashable type: 'list' >>> { { 1,2,3}} Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> { { 1,2,3}} TypeError: unhashable type: 'set' 并且需要注意的是,数据必须保证是唯一的,因为集合对于每种数据元素,只会保留一份。例如: >>> { 1,2,1,(1,2,3),'c','c'} { 1, 2, 'c', (1, 2, 3)} 由于 Python 中的 `set 集合`是无序的,所以每次输出时元素的排序顺序可能都不相同。 其实,Python 中有两种集合类型,一种是 `set 类型`的集合,另一种是 `frozenset 类型`的集合,它们唯一的区别是,`set 类型`集合可以做添加、删除元素的操作,而 `forzenset 类型`集合不行。 # 创建 set集合(2种) # Python 提供了 `2 种`创建 set 集合的方法,分别是使用 `{}` 创建和使用 `set() 函数`将列表、元组等类型数据转换为集合 ## 1) 使用 \{\} 创建 ## 在 Python 中,创建 `set 集合`可以像列表、元素和字典一样,直接将集合赋值给变量,从而实现创建集合的目的,其语法格式如下: setname = { element1,element2,...,elementn} 其中,setname 表示集合的名称,起名时既要符合 Python 命名规范,也要避免与 Python 内置函数重名。 举个例子: a = { 1,'c',1,(1,2,3),'c'} print(a) 输出:{ 1, 'c', (1, 2, 3)} ## 2) set()函数创建集合 ## `set() 函数`为 Python 的内置函数,其功能是将字符串、列表、元组、range 对象等可迭代对象转换成集合。该函数的语法格式如下: setname = set(iteration) 其中,iteration 就表示字符串、列表、元组、range 对象等数据。 例如: set1 = set("c.biancheng.net") set2 = set([1,2,3,4,5]) set3 = set((1,2,3,4,5)) print("set1:",set1) print("set2:",set2) print("set3:",set3) 输出: set1: { 'a', 'g', 'b', 'c', 'n', 'h', '.', 't', 'i', 'e'} set2: { 1, 2, 3, 4, 5} set3: { 1, 2, 3, 4, 5} 注意,如果要创建空集合,只能使用 `set() 函数`实现。因为直接使用一对 `{}`,Python 解释器会将其视为一个空字典。 # 访问set集合元素 # 由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素。 Python 中,访问集合元素最常用的方法是使用循环结构,将集合中的数据逐一读取出来。 例如: a = { 1, 'c', 1, (1, 2, 3), 'c'} for ele in a: print(ele, end=' ') 输出:c 1 (1, 2, 3) # 删除set集合 # 和其他序列类型一样,手动函数集合类型,也可以使用 `del()` 语句,例如: a = { 1,'c',1,(1,2,3),'c'} print(a) del(a) print(a) 输出: { 1, 'c', (1, 2, 3)} Traceback (most recent call last): File "C:\Users\mengma\Desktop\1.py", line 4, in <module> print(a) NameError: name 'a' is not defined Python `set 集合`最常用的操作是向集合中添加、删除元素,以及集合之间做交集、并集、差集等运算 # set集合中添加元素 # set 集合中添加元素,可以使用 set 类型提供的 `add() 方法`实现,该方法的语法格式为: setname.add(element) 其中,setname 表示要添加元素的集合,element 表示要添加的元素内容。 需要注意的是,使用 `add() 方法`添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值,不能添加列表、字典、集合这类可变的数据,否则 Python 解释器会报 TypeError 错误。例如: a = { 1,2,3} a.add((1,2)) print(a) a.add([1,2]) print(a) 输出: { (1, 2), 1, 2, 3} Traceback (most recent call last): File "C:\Users\qinjl\Desktop\1.py", line 4, in <module> a.add([1,2]) TypeError: unhashable type: 'list' # set集合中删除元素 # 删除现有 set 集合中的指定元素,可以使用 `remove() 方法`,该方法的语法格式如下: setname.remove(element) 使用此方法删除集合中元素,需要注意的是,如果被删除元素本就不包含在集合中,则此方法会抛出 KeyError 错误,例如: a = { 1,2,3} a.remove(1) print(a) a.remove(1) print(a) 输出: { 2, 3} Traceback (most recent call last): File "C:\Users\qinjl\Desktop\1.py", line 4, in <module> a.remove(1) KeyError: 1 如果我们不想在删除失败时令解释器提示 KeyError 错误,还可以使用 `discard() 方法`,此方法和 `remove() 方法`的用法完全相同,唯一的区别就是,当删除集合中元素失败时,此方法不会抛出任何错误。 a = { 1,2,3} a.remove(1) print(a) a.discard(1) print(a) 输出: { 2, 3} { 2, 3} # set集合做交集、并集、差集运算 # 集合最常做的操作就是进行交集、并集、差集以及对称差集运算,首先有必要给大家普及一下各个运算的含义。 ![在这里插入图片描述][20210707171948128.png] 图中,有 2 个集合,分别为 `set1={1,2,3}` 和 `set2={3,4,5}`,它们既有相同的元素,也有不同的元素。以这两个集合为例,分别做不同运算的结果如下表所示。 <table> <thead> <tr> <th>运算操作</th> <th>Python运算符</th> <th>含义</th> <th>例子</th> </tr> </thead> <tbody> <tr> <td>交集</td> <td>&</td> <td>取两集合公共的元素</td> <td>>>> set1 & set2<br>{3}</td> </tr> <tr> <td>并集</td> <td>|</td> <td>取两集合全部的元素</td> <td>>>> set1 | set2<br>{1,2,3,4,5}</td> </tr> <tr> <td>差集</td> <td>-</td> <td>取一个集合中另一集合没有的元素</td> <td>>>> set1 - set2<br>{1,2}<br>>>> set2 - set1<br>{4,5}</td> </tr> <tr> <td>对称差集</td> <td>^</td> <td>取集合 <code>A</code> 和 <code>B</code> 中不属于 <code>A&B</code> 的元素</td> <td>>>> set1 ^ set2<br>{1,2,4,5}</td> </tr> </tbody> </table> # set集合方法详解 # >>> dir(set) ['add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update'] <table> Python set方法 <tbody> <tr> <th> 方法名</th> <th> 语法格式</th> <th> 功能</th> <th> 实例</th> </tr> <tr> <td> add()</td> <td> set1.add()</td> <td> 向 set1 集合中添加数字、字符串、元组或者布尔类型</td> <td> >>> set1 = {1,2,3}<br> >>> set1.add((1,2))<br> >>> set1<br> {(1, 2), 1, 2, 3}</td> </tr> <tr> <td> clear()</td> <td> set1.clear()</td> <td> 清空 set1 集合中所有元素</td> <td> >>> set1 = {1,2,3}<br> >>> set1.clear()<br> >>> set1<br> set()<br> <br> set()才表示空集合,{}表示的是空字典</td> </tr> <tr> <td> copy()</td> <td> set2 = set1.copy()</td> <td> 拷贝 set1 集合给 set2</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = set1.copy()<br> >>> set1.add(4)<br> >>> set1<br> {1, 2, 3, 4}<br> >>> set1<br> {1, 2, 3}</td> </tr> <tr> <td> difference()</td> <td> set3 = set1.difference(set2)</td> <td> 将 set1 中有而 set2 没有的元素给 set3</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {3,4}<br> >>> set3 = set1.difference(set2)<br> >>> set3<br> {1, 2}</td> </tr> <tr> <td> difference_update()</td> <td> set1.difference_update(set2)</td> <td> 从 set1 中删除与 set2 相同的元素</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {3,4}<br> >>> set1.difference_update(set2)<br> >>> set1<br> {1, 2}</td> </tr> <tr> <td> discard()</td> <td> set1.discard(elem)</td> <td> 删除 set1 中的 elem 元素</td> <td> >>> set1 = {1,2,3}<br> >>> set1.discard(2)<br> >>> set1<br> {1, 3}<br> >>> set1.discard(4)<br> {1, 3}</td> </tr> <tr> <td> intersection()</td> <td> set3 = set1.intersection(set2)</td> <td> 取 set1 和 set2 的交集给 set3</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {3,4}<br> >>> set3 = set1.intersection(set2)<br> >>> set3<br> {3}</td> </tr> <tr> <td> intersection_update()</td> <td> set1.intersection_update(set2)</td> <td> 取 set1和 set2 的交集,并更新给 set1</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {3,4}<br> >>> set1.intersection_update(set2)<br> >>> set1<br> {3}</td> </tr> <tr> <td> isdisjoint()</td> <td> set1.isdisjoint(set2)</td> <td> 判断 set1 和 set2 是否没有交集,有交集返回 False;没有交集返回 True</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {3,4}<br> >>> set1.isdisjoint(set2)<br> False</td> </tr> <tr> <td> issubset()</td> <td> set1.issubset(set2)</td> <td> 判断 set1 是否是 set2 的子集</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {1,2}<br> >>> set1.issubset(set2)<br> False</td> </tr> <tr> <td> issuperset()</td> <td> set1.issuperset(set2)</td> <td> 判断 set2 是否是 set1 的子集</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {1,2}<br> >>> set1.issuperset(set2)<br> True</td> </tr> <tr> <td> pop()</td> <td> a = set1.pop()</td> <td> 取 set1 中一个元素,并赋值给 a</td> <td> >>> set1 = {1,2,3}<br> >>> a = set1.pop()<br> >>> set1<br> {2,3}<br> >>> a<br> 1</td> </tr> <tr> <td> remove()</td> <td> set1.remove(elem)</td> <td> 移除 set1 中的 elem 元素</td> <td> >>> set1 = {1,2,3}<br> >>> set1.remove(2)<br> >>> set1<br> {1, 3}<br> >>> set1.remove(4)<br> Traceback (most recent call last):<br> File "<pyshell#90>", line 1, in <module><br> set1.remove(4)<br> KeyError: 4</td> </tr> <tr> <td> symmetric_difference()</td> <td> set3 = set1.symmetric_difference(set2)</td> <td> 取 set1 和 set2 中互不相同的元素,给 set3</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {3,4}<br> >>> set3 = set1.symmetric_difference(set2)<br> >>> set3<br> {1, 2, 4}</td> </tr> <tr> <td> symmetric_difference_update()</td> <td> set1.symmetric_difference_update(set2)</td> <td> 取 set1 和 set2 中互不相同的元素,并更新给 set1</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {3,4}<br> >>> set1.symmetric_difference_update(set2)<br> >>> set1<br> {1, 2, 4}</td> </tr> <tr> <td> union()</td> <td> set3 = set1.union(set2)</td> <td> 取 set1 和 set2 的并集,赋给 set3</td> <td> >>> set1 = {1,2,3}<br> >>> set2 = {3,4}<br> >>> set3=set1.union(set2)<br> >>> set3<br> {1, 2, 3, 4}</td> </tr> <tr> <td> update()</td> <td> set1.update(elem)</td> <td> 添加列表或集合中的元素到 set1</td> <td> >>> set1 = {1,2,3}<br> >>> set1.update([3,4])<br> >>> set1<br> {1,2,3,4}</td> </tr> </tbody> </table> [20210707171948128.png]: /images/20221005/fca350323b064aa2bf71c458e0dba05b.png
还没有评论,来说两句吧...