# 14. set集合数据类型
# 集合类型(set)
set集合是Python的一个基本数据类型,一般不是很常用
set中的元素不能重复的、无序的、可hash的(整形,字符串,元组,布尔)
set集合类型类似于dict字典类型,但是没有value值,只有key值,也是用 { } 中括号(花括号) 表示
set集合类型中的元素必须是可hash的,但是set集合类型本身是不可hash的,所以set类型中的值是可变的
so = {"江凡","江小凡","江凡凡","江凡",1,2,3,True,True}
print(so)
执行结果:
{1, 2, 3, '江凡凡', '江小凡', '江凡'}
以上实例,在set的特性中,去重复,无序
# 列表去重
如有一个列表,需要给他去重,可以使用set类型
注意:通过这种方式,列表的顺序会发生改变
so = ["江凡","江小凡","江凡凡","江凡",1,2,3]
so = set(so)
wo = list(so)
print("set类型下:",so)
print("使用set类型后去重的结果:",wo)
执行结果:
set类型下: {1, 2, 3, '江凡', '江凡凡', '江小凡'}
使用set类型后去重的结果: [1, 2, 3, '江凡', '江凡凡', '江小凡']
以上实例,先把列表转成集合,在转成列表就完成了去重操作,不过注意,这样子完成后,顺序会改变
# set集合类型 增 删 改 查
# 增加
# 增加 - add()
使用add()函数对集合进行增加内容
如果有重复的内容是不会被添加进set集合中的
格式:变量.add(值)
so = {"江凡","江小凡","江凡凡"}
so.add("江国凡")
print(so)
执行结果:
{'江凡凡', '江凡', '江国凡', '江小凡'}
以上实例,使用add()函数进行增加
so = {'江凡凡', '江凡', '江国凡', '江小凡'}
so.add("江国凡")
print(so)
执行结果:
{'江凡', '江小凡', '江国凡', '江凡凡'}
以上实例,使用add()函数进行增加,但是增加的内容在原来的集合中以存在,默认是不增加,而不是集合的去重特性
# 迭代更新(多集合增加) - update()
迭代增加,是通过增加的内容,一个值或元素都是独立的集合元素,类似for循环
格式:变量.update(值)
so = {"江凡","江小凡","江凡凡"}
so.update("江国凡")
print(so)
执行结果:
{'江', '国', '江小凡', '凡', '江凡', '江凡凡'}
以上实例,增加的内容"江国凡",增加后,每个值都是独立的集合元素
# 删除
# 删除 (随机删除)- pop()
通过pop()删除集合中的元素,默认是删除最后一个
因为set集合是无序的,每次执行的结果都不一样,所以使用pop()函数删除的时候删除的内容也是随机的
格式:变量.pop()
so = {'江凡凡', '江凡', '江国凡', '江小凡'}
wo = so.pop()
print("删除值:",wo)
print(so)
执行结果:
删除值: 江凡凡
{'江凡', '江国凡', '江小凡'}
以上实例,通过pop()函数删除在根据set集合的特性,所以得出的结果,随机删除
pop()函数是可以返回删除值的
# 指定元素删除 - remove()
指定集合中的元素删除,如果元素不存在,程序报错
格式:变量.remove(值)
so = {'江凡凡', '江凡', '江国凡', '江小凡'}
wo = so.remove("江凡")
print(so)
执行结果:
{'江国凡', '江小凡', '江凡凡'}
# 清空集合 - clear()
使用clear()函数可以清空集合,返回值:set()
注意:set集合如果是空,打印出来的是set(),因为要和dict字典区分开
格式:变量.clear()
so = {'江凡凡', '江凡', '江国凡', '江小凡'}
so.clear()
print(so)
执行结果:
set()
# 修改
在set集合中的数据没有索引,也没办法去定位一个元素,所以没办法直接修改
但是可以采用先删除后添加的方式来完成修改操作
要求:{'江凡凡', '江凡', '江国凡', '江小凡'},把江凡改成江江凡
so = {'江凡凡', '江凡', '江国凡', '江小凡'}
so.remove("江凡")
so.add("江江凡")
print(so)
执行结果:
{'江国凡', '江江凡', '江凡凡', '江小凡'}
# 查询 - for循环查询
set集合是一个可迭代对象,所以可以进行for循环
so = {'江凡凡', '江凡', '江国凡', '江小凡'}
for i in so:
print(i)
执行结果:
江凡
江小凡
江国凡
江凡凡
# set集合的常用操作
# 交集 - intersection()
查看两个集合中的共有元素,就是查看二个集合中的相同元素
格式:
集合1.intersection(集合2)
so = {'江凡凡', '江凡', '江国凡'} wo = {'江国凡', '江小凡','江江凡'} print(so.intersection(wo)) 执行结果: {'江国凡'}
以上实例,通过 intersection()函数来找到二个集合的相同元素
集合1 & 集合2
so = {'江凡凡', '江凡', '江国凡'} wo = {'江国凡', '江小凡','江江凡'} print(so & wo) 执行结果: {'江国凡'}
以上实例,通过 & 运算符来找到二个集合的相同元素
# 反交集 - symmetric_difference()
看到名字就知道了这函数的用法吧
反交集的用法跟交集一样,不过得到的结果的是相反的
反交集,获取二个集合中单独存在的数据
格式:
集合1.symmetric_difference(集合2)
so = {'江凡凡', '江凡', '江国凡'} wo = {'江国凡', '江小凡','江江凡'} print(so.symmetric_difference(wo)) 执行结果: {'江凡', '江江凡', '江凡凡', '江小凡'}
以上实例,通过 symmetric_difference()函数来找到二个集合的非相同元素
集合1 ^ 集合2
so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so ^ wo)
执行结果:
{'江江凡', '江凡凡', '江小凡', '江凡'}
以上实例,通过 ^ 运算符,来找到二个集合的非相同元素
# 并集 - union()
把二个集合的元素合并输出
格式:
集合1.union(集合2)
so = {'江凡凡', '江凡', '江国凡'} wo = {'江国凡', '江小凡','江江凡'} print(so.union(wo)) 执行结果: {'江小凡', '江凡', '江江凡', '江凡凡', '江国凡'}
以上实例,通过union() 函数把二个集合的元素合并输出
注意:因set集合的特性,就算是二个集合合并如果有相同的元素,set集合也是会进行去重操作
集合1 | 集合2
so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so | wo)
执行结果:
{'江江凡', '江凡', '江凡凡', '江国凡', '江小凡'}
以上实例,通过 | 运算符,把二个集合的元素合并输出
注意:因set集合的特性,就算是二个集合合并如果有相同的元素,set集合也是会进行去重操作
# 差集 - difference()
差集,二个集合对比,获取第一个集合的单独元素(不重复的元素)
格式:
- 集合1.difference(集合2)
so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so.difference(wo))
执行结果:
{'江凡', '江凡凡'}
以上实例,通过difference()函数,将集合1跟集合2对比去重,获取集合1 非重复的元素
- 集合1 - 集合2
so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so - wo)
执行结果:
{'江凡凡', '江凡'}
以上实例,通过 - 运算符,将集合1跟集合2对比去重,获取集合1 非重复的元素
# 子集 - issubset()
查看集合1是集合2的子集吗,科学数学运算
返回值:True / False
格式:
集合1.issubset(集合2)
so = {'江凡凡', '江凡', '江国凡'} wo = {'江国凡', '江小凡','江江凡'} print(so.issubset(wo)) 执行结果: False
以上实例,通过issubset()函数,对比集合1 是否是 集合2 的子集
集合1 < 集合2
so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so < wo)
执行结果:
False
以上实例,通过 < 运算符,对比集合1 是否是 集合2 的子集
# 超集 - issuperset()
查看集合1是集合2的超集吗,科学数学运算
返回值:True / False
格式:
集合1.issuperset(集合2)
so = {'江凡凡', '江凡', '江国凡'} wo = {'江国凡', '江小凡','江江凡'} print(so.issuperset(wo)) 执行结果: False
以上实例,通过issuperset()函数,对比集合1 是否是 集合2 的超集
集合1 < 集合2
so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so > wo)
执行结果:
False
以上实例,通过 > 运算符,对比集合1 是否是 集合2 的超集
# 数据保存 - frozenset()
set 集合本身是可以发生改变的,是不可hash的,可以使用frozenset()函数 来保存数据
frozenset()函数 是不可变的,也就是一个可哈希的数据类型
so = frozenset(['江凡凡', '江凡', '江国凡','江小凡','江江凡'])
wo = {so:"123"}
print("frozenset()函数的数据类型:",type(so))
print(wo)
for i in so:
print(i)
执行结果:
frozenset()函数的数据类型: <class 'frozenset'>
{frozenset({'江凡凡', '江国凡', '江凡', '江小凡', '江江凡'}): '123'}
江凡凡
江国凡
江凡
江小凡
江江凡