一、定义
set是一个无序且不重复的元素集合。
集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小),用 for 循环迭代集合的成员。但是因为集合本身是无序的,不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。
set和dict一样,只是没有value,相当于dict的key集合,由于dict的key是不重复的,且key是不可变对象因此set也有如下特性:
1. 不重复
2. 元素为不可变对象
set的创建
本身使用 {} 进行创建,如果 {}里面没有元素,默认表示 dict类型,也就是创建空元素的set集合,不能用{}如果要创建一个空元素的set,使用 set()使用{} 里面可以数值型、字符串、元组, 不可以用字典和集合,里面可以放多个元素
· 如果使用 set,因为set需要对里面的元素做遍历循环,做去重操作,做无序排列,所以要求元素必须可遍历,所以里面可以使用字符串、元组、集合、字典
· {}里面不能用 list集合、set里面不能用数值型
#set里面只能有一个参数
a = set()
print(a,type(a))
#字符串
a = set('boy')
print(a,type(a))
#元组
a = set((1,2,3))
print(a,type(a))
#集合
a = set(['a','b','c','d','e'])
print(a,type(a))
#dict
a = set({'k1':'v1','k2':'v2'})
print(a,type(a))
#set
a = set({'k1','k2'})
print(a,type(a))
#默认变成 字典 dict,不可使用
a = {}
#数值型
a = {10}
#元组
a = {(1,2,3)}
#字符串
a= {'boy','girl'}
#因为使用 {} 不会对里面元素做修改,但是set是一个无序的,而 list是有序的
# a= {['boy','girl']}
print(a,type(a))
三、基本操作
增加元素
里面可以放 字符串、数值型、元组不可以放list集合和字典
a = {'abc','def'}
a.add(10)
a.add('ghi')
a.add((1,2,3))
print(a)
a = set('abc')
a.add(10)
#不能添加集合
# a.add([10,20])
print(a)
删除
remove(key)删除里面的元素,如果key值不存在,会报错discard(key)删除里面的元素,如果key值不存在,不会报错pop()删除默认打印顺序的第一个,不能放参数del对象 ,从内存直接清楚掉该变量,不可访问
a = {11,44,22,88,4,76,33,23}
print(a)
d = 22
ret = a.discard(d)
print('使用discard删除之后:',a,ret)
a.add(d)
print('重新增加删除的元素:',a)
ret = a.remove(22)
print('使用remove删除之后:',a,ret)
a.add(d)
print('重新增加删除的元素:',a)
ret = a.pop()
print('使用pop删除之后:',a,ret)
#使用del 直接删掉变量a,删除后不可访问
del a
修改更新
a.update(b) 把a 和 b 合并起来并且去重,然后赋值给a, 做类似修改的操作update做修改的时候,先对 b 进行遍历循环,然后去重,然后赋值
a = {11,33,22}
b = {22,44,55}
c = [55,66,77]
# update里面放 一个 set
a.update(b)
# update里面放一个集合
a.update(c)
# update里面放一个元组
a.update((10,20,88))
#update里面放一个set类型
a.update({'a','b'})
# update里面放一个字典,只会遍历 key值出来
a.update({'a':'b','aa':'bb'})
print(a)
print(b)
比较
diffrenceset1.difference(x) x可以用 集合、set、字符串、元组,如果使用字典的话,只会取 key值进行比较diffrence 不会改变原始 set的内容diffrence_updateset1.difference_update(x) 先找出set1 和 x不同的元素,不同元素不包含 x里面的,然后将结果赋值给 set1
x.difference(y)(取x和y的不同元素,包含x的内容,不包含y的内容)x + y 然后去重
x = {11,22,33}
y = {11,44}
#判断se 里面的元素 和 y里面进行比较,以se为主,结果不包含y的值,并且不会改变 se的值
temp = x.difference(y)
x = temp
#如果 y是一个字典数据,那么只取key值判断
# temp = x.difference({33:111,44:444})
print('比较的不同元素,不包含y里面的值:',temp)
print('比较不同之后,不对原始数据修改:',x)
x = {11,22,33}
y = [11,44]
temp = x.difference_update(y)
print('使用difference_update 修改之后的返回:',temp)
print('使用difference_update 比较之后,原始数据变成比较结果:',x)
x.symmetric_difference(y)(取x和y的不同元素,包含x的内容,并且包含y的内容)x + y
x = {11,22,33}
y = {11,44,22}
# x和 y的交集 包含x 里面的元素 和 y里面的元素
temp = x.symmetric_difference(y)
print(temp)
print(x)
temp = x.symmetric_difference_update(y)
print(temp)
print(x)
如何取得两个 集合的 交集
a. intersection(b)(表示a 和 b相同的元素)
#取相同的交集
x = {11,22,33}
y = {11,44,22}
#使用 intersection 取两个集合的 交集,就是相同的元素
temp = x.intersection(y)
print(temp)
print(x)
#使用intersection_update 先获取 交集列表,然后赋值给 x
temp = x.intersection_update(y)
print(temp)
print(x)
如何获取两个集合的 并集
union表示将ae的元素和x的元素加起来,然后去重,不会将结果直接赋值给xupdate也可以达到获取并集的效果,但是呢会直接将结果赋值给x
x = {11,22,33}
ae = {11,44}
temp = x.union(ae)
print(temp)
print('使用union获取并集之后的x:',x)
temp = x.update(ae)
print(temp)
print('使用update 获取并集之后,赋值给x:',x)
判断是 子集 或者 父集合的方法
x = {11,22,33}
ae = {11,44}
y = {11,44,22}
# 判断是否不存在交集(有交集返回 false、不存在交集返回 true)
temp = x.isdisjoint(y)
print('x和y是否存在交集:',temp)
# 判断x 是否是 y的子集
temp = x.issubset(y)
print('x是否是y的子集:',temp)
temp = ae.issubset(y)
print('ae是否是y的子集:',temp)
#判断x是否是y的父集合,也就是x是否包含y的每一个元素
temp = x.issuperset(y)
print('x是否是be的父集合,也就是x是否包含be的每一个元素:',temp)
temp = y.issuperset(ae)
print('be是ae的父集合,包含ae里面的所有元素:',temp)
a 和 b的并集
a 和 b的交集
a 和 b的差集(元素在a中有,但是不在b中)
a 和 b的对称差集(a 和 b中都有的元素,然后取反)
a = [11,22,33,55,66]
b = [11,44,66]
# | 是或者,表示既可以是a,也可以是b,就是a和b的并集
s = a | b
print(s)
# & 是并且,表示既要满足 a ,又要满足b,成为 a 和 b的交集
s = a & b
print( s )
# - 表示从 a里面移除 和b有相同的元素,剩下的就是a
s = a - b
print(s)
# ^ 扬抑符 表示取 a + b - a和b的交集
s = a ^ b
print(s)
数据类型转换
set1 = set(range(1))
#将 set 转换成 list集合
list1 = list(set1)
#将set 转换成 tuple
tup = tuple(set1)
#将 set转换成 字符串
str1= str(set1)
print(list1, type(list1))
print(tup, type(tup))
print(str1, type(str1))