引子:
在之前我们要拿到交集只能是用循环判断。
l = ['张三','李四','老男孩']
p = ['张三','李四','alex']
现在要找出既在linux班上课也在python班上课的学生,应该怎么找?
l = ['张三','李四','old_drivers'] p = ['张三','李四','goodboy'] l_p = [] for i in l: if i in p: l_p.append(i) print(l_p)
集合是一个数学概念:有一个或多个确定的元素所构成的整体叫做集合,无序的。
特征:
1、确定性(元素必须可hash)
2、互异性(去重,把一个列表变成集合,就自动去重了)
3、无序性(集合中的元素没有先后之分,如集合{}3,4,5}和{3,5,4}算作一个集合)
注意点:集合存在的意义就在于去重和关系运算
语法:
定义集合:s = {}
列表转成集合:set() 元组也可以转
#列表转集合 l = {1,2,3,4,5,6,2,7,8,4,3} set(l) print(l) ##增删改查 l = {1,2,3,4,5,6} l.add(7) #增加 print(l) print(l.pop()) #删除并返回,随机删 l.remove(5) #删除指定的值 l.discard(5) #删除指定的值,不存在不会报错 l.update([5,6,7,8,9,2]) #扩展,增加多个值 l.clear() #清空所有的值
l.copy() #浅拷贝 print(l)
包含关系:
in, not in :判断某元素是否在集合内
==,!= :判断两个集合是否相等
##关系测试 l = {'张三','李四','old_drivers'} p = {'张三','李四','goodboy'} print(l.intersection(p)) #交集,intersection print(l&p) #交集,&--->and符号 print(l.difference(p)) #差集,只在l中不在p中 print(l - p) #差集,只在l中不在p中 print(p.difference(l)) #差集,只在p中不在l中 print(p - l) #差集,只在p中不在l中 print(l.union(p)) #并集,两个集合相加 print(p | l) #并集,两个集合相加 print(l.symmetric_difference(p)) #对称差集 print(l ^ p) #对称差集 l = {'张三','李四','old_drivers','goodboy'} p = {'张三','李四','goodboy'} print(p.issubset(l)) #判断p 是不是 l的子集 p <= l print(p.issuperset(l)) #判断p 是不是 l的父集 等同于 p>= l print(p.isdisjoint(l)) #判断两个集合是不是不相交 print(p.difference_update(l)) #把差集赋值给p print(p.intersection_update(l)) #把交集赋值给p
练习:
一.关系运算
有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
linuxs={'wupeiqi','oldboy','gangdan'}
1. 求出即报名python又报名linux课程的学员名字集合
2. 求出所有报名的学生名字集合
3. 求出只报名python课程的学员名字
4. 求出没有同时这两门课程的学员名字集合
# 1. 求出即报名python又报名linux课程的学员名字集合 print(pythons.intersection(linuxs)) print(pythons & linuxs)
# 2. 求出所有报名的学生名字集合 print(linuxs.union(pythons)) print(pythons | linuxs)
# 3. 求出只报名python课程的学员名字 print(pythons.difference(linuxs)) print(pythons - linuxs)
# 4. 求出没有同时这两门课程的学员名字集合 print(pythons.symmetric_difference(linuxs)) print(pythons ^ linuxs)