一 介绍
- 类名:set(集合)
- 定义:
- 可变的集合定义:
- 变量名 = { 元素, 元素2, ... }
- 元素为不可变的任意数据类型。
- 变量名 = set(可迭代对象)
- 可迭代对象:字符串(str),列表(list),元祖(tuple)
- 可迭代对象中的元素:不可变的任意数据类型
s_right = set(['elsa', 20, 'kate', 22]) # 正确
s_wrong = set([['elsa', 20], ['kate', 22]]) # 错误,迭代对象中的元素为可变数据类型
- 不可变的集合定义:
- 变量名 = frozenset(可迭代对象)
- 数据类型的可变与不可变:
- 不可变数据类型:(对象的内存入口地址与值不可变)不支持增删改
- 字符串(str),元祖(tuple),数字(int)
- 可变数据类型:(对象的内存入口地址不可变,其值可变)支持增删改
- 列表(list),字典(dict),集合(set)
- 存储原理
- 无序存储(即定义的顺序与输出的顺序不一致)
s = {3, 2, 1, 0}
print(s) # {0, 1, 2, 3}
- 应用场景
- 去除重复的元素
- 关系运算
- 常用功能
- 无下标,无切片,支持for...in...遍历
- add(),clear(),copy(),pop(),remove(),discard()
- -,&,^,|
二 常规使用
- 增
- add(元素),新增 1 个元素
s = {1, 2, 3}
s.add('elsa')
print(s) # {'elsa', 1, 2, 3}
- update(可迭代对象),通过可迭代对象,新增多个元素
s = {1, 2, 3}
s.update( 'elsa' )
print(s) # {1, 2, 3, 's', 'l', 'e', 'a'}
- copy()
- 赋值(=)是引用方式,新变量名依然指向旧变量的内存地址
- copy 是重新赋值,在内存开辟新地址给新变量名
study_python = [1, 2, 3, 4]
set_python = set(study_python)
s1 = set_python.copy()
s2 = set_python
print(s1,id(s1),id(set_python)) # {1, 2, 3, 4} 42452808 42269832
print(s2,id(s2),id(set_python)) # {1, 2, 3, 4} 42269832 42269832
set_python.discard(2)
print(s1,s2) # {1, 2, 3, 4} {1, 3, 4}
- 删除
- clear(),清空所有元素
- pop(),随机删除元素
- remove(元素),删除元素,元素不存在在报错
- discard(元素),删除元素,元素不存在则不会报错
三 集合运算
- 交集(&):算出两个集合中共有的部分
study_python = ['lbc', 'cxl', 'lj', 'njn']
study_mysql = ['lbc', 'lbb', 'lj']
set_python = set(study_python)
set_mysql = set(study_mysql)
print(set_mysql & set_python) # {'lbc', 'lj'}
print(set_mysql.intersection(set_python)) # {'lbc', 'lj'}
print(set_mysql) # {'lbc', 'lbb', 'lj'}
set_mysql.intersection_update(set_python) # 运算并更新
print(set_mysql) # {'lbc', 'lj'}
- 并集(|):将两个集合合并在一起(去掉重复部分)
study_python = ['lbc', 'cxl', 'lj', 'njn']
study_mysql = ['lbc', 'lbb', 'lj']
set_python = set(study_python)
set_mysql = set(study_mysql)
print(set_mysql | set_python) # {'lbc', 'cxl', 'njn', 'lj', 'lbb'}
print(set_mysql.union(set_python)) # {'lbc', 'cxl', 'njn', 'lj', 'lbb'}
print(set_mysql) # {'lj', 'lbc', 'lbb'}
- 差集(-)
study_python = ['lbc', 'cxl', 'lj', 'njn']
study_mysql = ['lbc', 'lbb', 'lj']
set_python = set(study_python)
set_mysql = set(study_mysql)
print(set_mysql - set_python) # {'lbb'}
print(set_mysql.difference(set_python)) # {'lbb'}
print(set_mysql) # {'lbb', 'lbc', 'lj'}
set_mysql.difference_update(set_python)
print(set_mysql) # {'lbb'}
- 补集(^):合并两个集合的非共有部分
study_python = ['lbc', 'cxl', 'lj', 'njn']
study_mysql = ['lbc', 'lbb', 'lj']
set_python = set(study_python)
set_mysql = set(study_mysql)
print(set_mysql ^ set_python) # {'lbb', 'cxl', 'njn'}
print(set_mysql.symmetric_difference(set_python)) # {'lbb', 'cxl', 'njn'}
print(set_mysql) # {'lbb', 'lj', 'lbc'}
set_mysql.symmetric_difference_update(set_python)
print(set_mysql) # {'lbb', 'cxl', 'njn'}
- 集合关系(父子或交集)
study_python = [1, 2, 3, 4]
study_linux = [1, 2]
study_mysql = [2, 3, 5]
study_excel = [6, 7]
set_python = set(study_python)
set_linux = set(study_linux)
set_mysql = set(study_mysql)
set_excel = set(study_excel)
print(set_python.isdisjoint(set_excel)) # 结果:True。若没有存在交集,则 True
print(set_python.isdisjoint(set_mysql)) # 结果:False
print(set_python.issuperset(set_mysql)) # False
print(set_python.issuperset(study_linux)) # True。set_python 是否是(包含) study_linux 的父集
print(set_linux.issubset(study_python)) # True。 set_linux 是否是 study_python 的子集
四 关系运算
- >,>=,<,<=
study_python = [1, 2, 3, 4]
study_linux = [1, 2]
study_mysql = [2, 3, 5]
study_excel = [6, 7]
set_python = set(study_python)
set_linux = set(study_linux)
set_mysql = set(study_mysql)
set_excel = set(study_excel)
print(set_python >= set_linux) # True。
print(set_python > set_mysql) # False
print(set_python < set_mysql) # True