Python - 集合 - 进阶之路 - Day03

集合(set)是一个无序的不重复元素序列,集合是没有存储 value 的字典,python 的内置数据结构之一。

                                                                        集合示意图

一、 集合的特点

  1. 集合中不可以存储重复数据
  2. 集合中数据是无序的
  3. 集合中数据可以是任何不可变类型
  4. 集合可以根据需要动态伸缩
  5. 内存消耗较大

二、 集合的创建

1. 使用 {} 创建

# 集合中重复的元素会被去除掉
# 不能使用 {} 表示空集合,{} 表示空字典

s = {1, 2, 3, 4, 5, 5}

print(s)
print(type(s))
print(type({}))

运行结果:

{1, 2, 3, 4, 5}
<class 'set'>
<class 'dict'>

2. 调用内置函数 set()

# range 函数
print(set(range(1, 6)))

# 列表
print(set([3, 5, 9, 2, 6]))

# 元组
print(set((3, 5, 9, 2, 6)))

# 字符串形式,字符串是字符列表
print(set('35926'))

# 大括号形式
print(set({3, 5, 9, 2, 6}))

# 空集合
print(set())

运行结果:

{1, 2, 3, 4, 5}
{2, 3, 5, 6, 9}
{2, 3, 5, 6, 9}
{'2', '3', '6', '5', '9'}
{2, 3, 5, 6, 9}
set()

三、 集合见的关系、返回值都是布尔值

1.  两个集合是否相等(==、!=)

s4 = {2, 4, 6, 8}
s5 = {8, 6, 2, 4}
                 
# 集合是无序的,虽然元素在集合中顺序不相同,但是 s4 和 s5 还是相同的集合,所以返回 True
print(s4 == s5)  

2. 一个集合是否是另一个集合的子集 issubest()

s1 = {1, 2, 3, 4, 5, 6}   
s2 = {1, 2, 3}            
  
# 判断集合 s2 中的所有元素是不是都在 s1 的集合,如果是返回 True,否则返回 False                          
print(s2.issubset(s1))    

3. 一个集合是否是另一个集合的超集  issuperset()

s1 = {1, 2, 3, 4, 5, 6}   
s2 = {1, 2, 3}            
                          
# 判断集合 s1 中的所有元素是不是都包含在 s2 的集合,如果是返回 True,否则返回 False    
print(s2.issuperset(s1))    

4. 两个集合是否没有交集 isdisjoint()

s1 = {1, 2, 3, 4, 5, 6}   
s2 = {1, 2, 3}  

# 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False  
print(s1.isdisjoint(s2))  

四、 集合的数学操作

1. 两个集合的交集 & intersection 

# 交集后,生成一个新集合,原先两个集合不变

s1 = {1, 3, 5, 7}
s2 = {2, 3, 5, 8}

print(s1.intersection(s2))      #{3, 5}
print(s1 & s2)                  #{3, 5}
 
print(s1)                       #{1, 3, 5, 7}


#更新s1
# intersection_update() 用于获取两个或更多集合,把多个集合中都包含的元素返回给原始的集合
# intersection_update() 方法不同于 inter
# 因为 intersection() 方法是返回一个新的集合,   
# 而 intersection_update() 方法是在原始的集合

print(s1.intersection_update(s2))    #None
print(s1)                            #{3, 5}

2. 两个集合的并集 | union

# 做并集后,生成一个新集合,原先的集合不变

s1 = {1, 3, 5, 7}
s2 = {2, 3, 5, 8}

print(s1.union(s2))      #{1, 2, 3, 5, 7, 8}
print(s1 & s2)           #{1, 2, 3, 5, 7, 8}

3. 两个集合的差集 - difference

# 做差集后,生成一个新集合,差集的两个集合不变

s1 = {1, 3, 5, 7}
s2 = {2, 3, 5, 8}

# 返回一个集合,元素包含在集合 s1 但是不在集合 s2
print(s1.difference(s2))    # {1, 7}

# 移除集合 s1 和 s2 都包含的元素,然后生成新的集合 s1
print(s1.difference_uppdate(s2))    #None
print(s1)     #{1, 7}

4. 两个集合的对称差集 ^ symmetric_difference

s1 = {1, 3, 5, 7}
s2 = {2, 3, 5, 8}

# 移除两个集合 s1 和 s2 中都包含的元素,生成一个新的集合
print(s1.symmetric_difference(s2))    # {1, 2, 7, 8}

# 将集合 s1 中移除 s2 集合的重复元素,并将不重复的元素添加到 s1 集合中
print(s1.symmetric_difference_update(s2))    
print(s1)                             # {1, 2, 7, 8}

 五、 集合的查

s1 = {1, 2, 3, 4, 5, 6}   

# 遍历集合的元素      
for s in s1:   
    print(s)   
               
# 判读一个元素是否在一个集合
s = 6          
print(s in s1) 

六、 集合的增

1. 方法 add(一次只添加一个元素)

s = {3, 2, 6}
s.add(8)
print(s)    # {8, 2, 3, 6}

#集合中已存在的元素不会被添加

2. 方法 update(一次至少添加一个元素)

s6 = {3, 2, 6}      
                    
print(s6)           
                    
s6.update([1, 4])   
print(s6)           
                    
s6.update({5, 8})   
print(s6)           
                    
s6.update((10, 11)) 
print(s6)           

运行结果:

{2, 3, 6}
{1, 2, 3, 4, 6}
{1, 2, 3, 4, 5, 6, 8}
{1, 2, 3, 4, 5, 6, 8, 10, 11}

七、 集合的删

1. 调用 remove,一次删除一个一个指定的元素

s1 = {1, 2, 3, 4, 5, 6}

# 删除集合 s1 的元素 6
s1.remove(6)
print(s1)

# 删除集合中不存在的元素会报错
s1.remove(7) 

运行结果:

{1, 2, 3, 4, 5}
Traceback (most recent call last):
  File "/Users/zhulixiang/Downloads/pythonProject/thz/Day03/集合练习.py", line 8, in <module>
    s1.remove(7)
KeyError: 7

2. 调用方法 discard,一次只删一个指定的元素,不存在不报错

s1 = {1, 2, 3, 4, 5, 6}


s1.discard(1)
print(s1)                # {2, 3, 4, 5, 6}

# 删除集合中不存在元素不会报错
s1.discard(7)

3. 调用方法 pop ,一次只删一个任意元素,返回被删除元素

s = {3, 4, 5, 6}
print(s.pop())       #3
print(s)       # {4, 5, 6}

4. 调用方法 clear 清空集合

s1 = {1, 2, 3, 4, 5, 6}

# 清空当前集合
s1.clear()
print(s1)            # set()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值