数据类型详解之集合

数据类型详解-集合

确定的一组无序的数据的组合

  • 当前集合中元素的值不能重复
  • 由多个数据组合的复合型数据(容器类型数据)
  • 集合中的数据没有顺序
  • 功能:成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值