数据类型详解-集合
确定的一组无序的数据的组合
- 当前集合中元素的值不能重复
- 由多个数据组合的复合型数据(容器类型数据)
- 集合中的数据没有顺序
- 功能:成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。
1.集合的定义
- 可以直接使用 {} 来定义集合
- 可以使用set()进行集合的定义和转换
- 使用集合推导式完成集合的定义
集合中的元素不能重复,集合中存放的数据:Number,Strings,Tuple,冰冻集合
2.集合的基本操作和常规函数
-
定义集合
a = {123,'abc',False,'love',True,(1,2,3),0,3.1415,'123'} print(a) >>>{False, True, 3.1415, '123', 'abc', (1, 2, 3), 123, 'love'} # 1.无序。 # 2.布尔类型 True 表示为 1,False 表示为 0,所以输出里只有False没有0,它俩重复了 # 3.元素的值不能重复
-
检测值是否在集合中:a in set a not in set
-
len():获取集合中元素的个数
-
集合的遍历 for i in set:
-
set.add():添加元素,返回值为None
b = a.add('cxy') print(b) print(a) >>>None {False, True, 'cxy', 3.1415, 'love', (1, 2, 3), 123, '123', 'abc'}
-
set.pop():随机删除一个元素,并返回
-
set.remove():指定删除集合中的元素,不存在则报错,返回None
-
set.discard():指定删除集合中的元素,不存在也不会报错,返回None
-
set.clear():清空集合
-
set.update():添加新的元素或【集合】到set中,注意重复的会被忽略,返回None
-
set.copy():拷贝集合
集合中并不存在深拷贝的问题;
因为集合中的元素都是不可变,包括元组和冰冻集合【元组也是不可改变的哇】;
不存在拷贝后对集合中不可变的二级容器进行操作的问题。
3.冰冻集合:frozenset()
只能使用 frozenset() 函数进行冰冻集合的定义
- 冰冻集合一旦定义不能修改
- 冰冻集合只能做集合相关的运算:求交集,差集…
- frozenset() 本身就是一个强制转换类的函数,可以把其它任何容器类型的数据转为冰冻集合
- 冰冻集合也是无序的!!
#定义:可以把其它任何容器类型的数据转为冰冻集合
a = frozenset((1,'1','a'))
b = frozenset([1,'1','a'])
c = frozenset({1,'1','a'})
d = frozenset({1:1,'a':2})
print(a)
print(b)
print(c)
print(d)
>>>frozenset({1, 'a', '1'})
frozenset({1, 'a', '1'})
frozenset({1, 'a', '1'})
frozenset({1, 'a'})
#遍历:注意!冰冻集合也是无序的!
a = frozenset((1,'1','a'))
for i in a:
print(i)
>>>1
a
1
#推导式
a = frozenset((1,'1','a'))
print({i for i in a}) #这样写结果还是集合,也是无序的
>>>{1, 'a', '1'}
print([i for i in a]) #这样写就是列表
>>>[1, '1', 'a']
# 冰冻集合可以和普通集合一样,进行集合的运算:交集等
#copy()
a = frozenset((1,'1','a'))
b = a.copy()
print(b,type(b))
>>>frozenset({1, 'a', '1'}) <class 'frozenset'>
4.集合的推导式
#1.普通推导式
a = {1,2,3,4}
b = {i<<1 for i in a}
print(b)
>>>{8, 2, 4, 6}
#2.带有条件表达式的推导式
b = {i<<1 for i in a if i %2==0}
print(b)
>>>{8, 4}
#3.带有多循环的推导式
a = {1,2,3,4}
b = {1,2,3,4}
c = {i+j for i in a for j in b}
print(c)
>>>{2, 3, 4, 5, 6, 7, 8}
#重复的被去掉啦
#4.带有条件表达式的多循环的推导式
c = {i+j for i in a for j in b if i % 2==0 and j %2 == 0}
print(c)
>>>{8, 4, 6}
5.集合的运算
5.1集合的主要运算:交集、并集、差集、对称差集
- 交集 & set.intersection() set.intersection_update()
- 并集 | union() update()
- 差集 - difference(),difference_update()
- 对称差集 ^ symmetric_difference() symmetric_difference_update()
a = {1,2,3,4}
b = {1,2,5,6}
#交集 & 两个集合相交的部分
print(a & b)
#并集 | 两个集合并起来【注意去掉重复的值】
print(a | b)
#差集 A - B:A里有B里没有的
print(a - b)
#对称差集 ^ 并集 - 交集
print(a ^ b)
>>>{1, 2}
{1, 2, 3, 4, 5, 6}
{3, 4}
{3, 4, 5, 6}
a = {1,2,3,4}
b = {1,2,5,6}
#1.交集的函数
# set.intersection() 返回交集的结果,是一个新的集合
print(a.intersection(b))
>>>{1, 2}
# set.intersection_update() 计算两个集合的相交部分,把计算结果重新赋值给第一个集合 返回值为None
print(a.intersection_update(b)) #没有返回值
print(a)
print(b)
>>>None
{1, 2}
{1, 2, 5, 6}
#2.并集的函数
#set.union() 返回并集结果,新的集合
print(a.union(b))
>>>{1, 2, 3, 4, 5, 6}
#set.update() 求并集运算,并且把结果赋值给第一个集合 返回值为None
print(a.update(b))
print(a)
print(b)
>>>None
{1, 2, 3, 4, 5, 6}
{1, 2, 5, 6}
#3.差集的函数
# set.difference() 返回差集结果,新的集合
print(a.difference(b))
>>>{3, 4}
# set.difference_update() 把差集的结果,重新赋值给第一个集合,返回值为None
print(a.difference_update(b))
print(a)
print(b)
>>>None
{3, 4}
{1, 2, 5, 6}
#4.对称差集的函数
# set.symmetric_difference() 返回对称差集的结果 新的集合
print(a.symmetric_difference(b))
>>>{3, 4, 5, 6}
# set.symmetric_difference_update()
print(a.symmetric_difference_update(b))
print(a)
print(b)
>>>None
{3, 4, 5, 6}
{1, 2, 5, 6}
5.2 集合检测
- issuperset() 检测是否为超集
- issubset() 检测是否为子集
- isdisjoint() 检测是否不相交
a = {1,2,3,4,5}
b = {1,2,5}
# 1. set1.issuperset(set2) 检测set1是否为set2的超集(父集)
print(a.issuperset(b))
>>>True
# 2. set1.issubset(set2) 检测set1是否为set2的子集
print(b.issubset(a))
>>>True
# 3. set1.isdisjoint(set2) 检测是否不相交,不想交则返回True
print(a.isdisjoint())
>>>False