第27讲:集合—在我的世界里,你就是唯一
一 可变集合 set
1 概念:集合(set)是一个无序的不重复元素序列。无序不重复的特点决定它存在以下的应用场景:去重处理、关系测试
2 定义/创建:可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
3 语法:parame = {value01,value02,...} 或者 set(value)
4 集合的相关操作:https://www.cnblogs.com/linupython/p/6561700.html
- 创建:
- 使用 {} 创建:setname = {element1,element2,...,elementn} a = {1,2,3,4,5}
- set()函数创建集合:setname = set(iteration) b = set([6,7,8,9,10])
- 访问:
- 由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素
- 但是您可以使用 for 循环遍历 set 项目,或者使用 in 关键字查询集合中是否存在指定值
- 添加:
- add():添加一个元素到指定的集合,每次只能添加一个。需要注意的是使用 add() 方法添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值,不能添加列表、字典、集合这类可变的数据,否则 Python 解释器会报 TypeError 错误。 a.add(0)
- update():添加多个元素到指定集合,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。 a.update([2,3,7])
- 删除:
- remove():删除集合中指定的对象,一次只能删除一个,如果该对象不存在则报错 a.remove(3)
- discard():与remove()类似,也是删除指定的对象,一次只能删除一个,但是如果该对象不存在时不报错。 a.discard(0)
- pop():删除集合中任意一个对象,注意不能指定。 a.pop()
- clear():清空集合。 a.clear()
- del语句:彻底删除集合
- 集合长度:获取集合中元素,通过len方法实现。len(a)
- 集合的复制:copy() 方法用于拷贝一个集合(重新创建了一个集合)。b = a.copy()
5 判断两个集合关系的内置方法——关系测试常见操作
- difference()
- 功能:用于返回集合的差集,即返回的集合元素包含在第一个集合中,但不包含在第二个集合(方法的参数)中。
- 语法:set1.difference(set2)或set1 - set2
- issubset()
- 功能:判断集合set1是否为set2的子集,返回布尔值。
- 语法:set1.issubset(set2)
- issuperset()
- 功能:判断set1是否为set2的父集。
- 语法:set1.issuperset(set2)
- isdisjoint()
- 功能:判断set1和set2是否存在交集, 如果不存在返回True, 存在则返回False.
- 语法:set1.isdisjoint(set2)
- symmetric_difference()
- 功能:返回set1和set2的对称式差集,相当于执行set1.difference(set2)和set2.difference(set1),以新的set集合形式返回set1和set2中差异部分元素(不在两者中同时存在)集合(仅在set1和set2中出现过一次的元素不影响原set1和set2)。
- 语法:set1.symmetric_difference(set2)或set1 ^ set2
- symmetric_difference_update()
- 功能:返回set1和set2的对称式差集,并覆盖更新原set1集合(原来被调用操作的对象),即执行set1 = set1.symmetric_difference(set2)
- 语法:set1.symmetric_difference(set2)
- intersection()
- 功能:交集运算,以set方式返回set1和set2的交集部分(同时存在的元素),不影响原集合set1和set2.
- 语法:set1.intersection(set2)或set1 & set2
- intersection_update()
- 功能:执行交集运算,并将结果覆盖更新原集合set1(原来被调用操作的对象)。
- 语法:set1.intersection_update(set2)
- union()
- 功能:执行并集计算,合并set1和set2中的对象并做去重处理,最后以集合形式返回结果。
- 语法:set1.union(set2)或set1 | set2
- <=
- 功能:判断set1中的每个元素是否都在set2中,即判断set1是否为set2的子集,等同于set1.issubset(set2)
- 语法:set1 <= set2
二 不可变集合 frozenset()
1 定义:不可变集合就是一个无序的不可变的集合
2 语法:frozenset(value),其中value必须是可迭代对象
3 与集合set的区别:一旦创建就不可以改变。
4 用途:用来作为字典的键
5与tuple的区别:在于无序,元素不可重复,且元素只能是不可变类型
三 课后作业
0. 请问集合的唯一作用是什么呢?
答:集合几乎所有的作用就是确保里边包含的元素的唯一性,就像世界上没有两片完全相同的树叶一样,集合内不可能存在两个相同的元素!
1. 如果你希望创建的集合是不变的,应该怎么做?
答:frozenset()
2. 请问如何确定一个集合里边有多少个元素?
答:没错,len()函数正好可以满足你此刻的需求^_^
1 >>> num_set = set([1, 2, 3, 4, 5]) 2 >>> len(num_set) 3 5
3. 请目测以下代码会打印什么内容?
1 >>> num_set = set([1, 2, 3, 4, 5]) 2 >>> num_set[0]
答:会报错,因为集合是无序的。
4. 请问 set1 = {[1, 2]} 和 set1 = set([1, 2]) 执行的结果一样吗?
答:不一样,set1 = set([1, 2]) 会生成一个集合{1, 2},但set1 = {[1, 2]}却会报错。
1 >>> set1 = {[1, 2]} 2 Traceback (most recent call last): 3 File "<pyshell#17>", line 1, in <module> 4 set1 = {[1, 2]} 5 TypeError: unhashable type: 'list'
从报错信息上我们看到“列表不是可哈希类型”,没错,列表是可变的。所以它不可哈希。
其实你再想想就会觉得很有道理,利用哈希函数计算,相同的元素得到的哈希值(存放地址)是相同的,所以在集合中所有相同的元素都会覆盖掉,因此有了集合的唯一性。
然后你继续接着想就觉得更有道理了,通过哈希函数计算的地址不可能是按顺序排放的,所以集合才强调是无序的!
5. 打开你的IDLE,输入set1 = {1, 1.0},你发现了什么?
答:没错, 集合内容是{1.0},其实你弄懂了上一题,这一题一样容易:因为在Python的哈希函数会将相同的值的元素计算得到相同的地址,所以1和1.0是等值的^_^
6. 请问如何给集合添加和删除元素?
答:使用add()方法可以为集合添加元素,使用remove()方法可以删除集合中已知的元素。
1 >>> num1.add(6) 2 >>> num1 3 {0, 1, 2, 3, 4, 5, 6} 4 >>> num1.remove(6) 5 >>> num1 6 {0, 1, 2, 3, 4, 5}