python-集合(set)知识整理


####   集合     ####

  • set 集合 和 线性结构

  • 线性结构  的查询时间复杂度是  O(n),即随着数据规模的增大而增加耗时。
  • set集合 ,dict 字典  等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关
  • 可hash
    • 数字型:int、float、complex
    • 布尔型:True、False
    • 字符串:string、bytes
    • 元组:tuple
    • None
    • 以上都是不可变类型,成为可哈希 类型
set  的元素必须是可hash的。***  不管你嵌套多少层,只要有不可哈希的元素就会报错 !!!


集合特性: 1、元素必须是不可变类型(数字,字符串,元组),必须可ha
   2、不同元素组成,如果相同就会自动去重,只保留一个。
      3、集合是无序的
      4、集合是可变类型

定义集合:s = {1,4,32,1}

 使用s = set()时,必须是可迭代对象才行。

 



# 集合是一个可变的、无序的,不重复的数据组合,
它的主要作用如下:
  1、去重,把一个列表变成集合,就自动去重了
  2、关系测试,测试两组数据之前的交集、差集、并集等关系
(注:set元素要求必须可hash才能加入到set元素中)
因为没有顺序,所以无法被索引,但是可以被迭代。
list01 = [1,4,5,6,7,8,4,5,6]
print(list01,type(list01))
# [1, 4, 5, 6, 7, 8, 4, 5, 6] <class 'list'>
list01 = set(list01)
print(list01,type(list01))
# {1, 4, 5, 6, 7, 8} <class 'set'>

基本概念:
  全集
    所有元素的集合,
  子集subset和超集superset
    一个集合A所有元素都在另一个集合B内,A是B的子集,B是A的超集
  真子集和真超集
    A是B的子集,且A不等于B,A就是B的真子集,B是A的真超集。
  并集:过个集合合并的结果
  交集:多个集合的公共部分
  差集:集合中除去和其他集合公共部分



# ################### 交集 (intersection)符号为:【 & 】 #########################

 

# 交集 表示符号:& 表示 集合1和集合2 中都有的。
list02 = set([2,6,0,22,8,4])
print(list01,list02)
# {1, 4, 5, 6, 7, 8} {0, 2, 4, 6, 8, 22}
# # 交集 intersection
print(list01.intersection(list02))

# ################### 并集 (union)符号为: 【 | 】#########################

 


# 并集 表示符号:| 表示 集合1或者是集合2中有的
# # 并集 union 并起来去重
print(list01.union(list02))
# {0, 1, 2, 4, 5, 6, 7, 8, 22}

 



# ################### 差集 (difference)符号为:【 - 】 #########################

A -P = {} ,A -P 为空集,说明P包含A

 

 


# 差集表示符号:- 表示 set01 - set02 表示 set01中有的,set02中没有的
# set02 - set01 表示 set02中有的,set01中没有的
#  # 差集  difference list01中有的,list02中没有的
print(list01.difference(list02))
# {1, 5, 7}
print(list02.difference(list01))
# {0, 2, 22}


# ################### 子集 (issubset) #########################
aa.issubset(bb) 进行判断,aa是不是bb的子集

# ################### 父集 (issuperset #########################

 



# ################### 反向差集| 交叉补集| 对称差集 (symmetric_difference)符号为:【 ^ 】 #########################

 

 



# list01和list02里面,互相都没有的,取出来放到一块
print(list01.symmetric_difference(list02))

########################## 集合的功能介绍及举例说明 ###################################
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__:anxu.qi
# Date:2018/12/4
#######################################################################################
a = {11, 22, 33, 44, 66, 99, "oopp",1123, "111"}
b = {11,22,88,99,"oopp","opop"}

# ##################### add 向集合中添加元素 注:一次只允许添加一个元素 ####

# a.add("vivo")
# print(a) # {33, 66, 'opop', 'vivo', 11, 44, 77, 22, 55}

# #################### clear 删除集合的所有的元素 #################

 

# #################### copy 浅copy ####
重新赋值一份数据给s1


# #################### difference A中存在的B中不存在的 ####
# A中存在,B中不存在 返回一个新值,变量接受
c = a.difference(b)
print(c) # {33, 66, 1123, 44, '111'}
# #################### difference_update A中存在的B中不存在的,结果更新为A ####
a.difference_update(b)
print(a) # {33, 66, 1123, '111', 44}

a = {11, 22, 33, 44, 66, 99, "oopp",1123, "111"}
b = {11,22,88,99,"oopp","opop"}
# #################### discard 移除指定的元素,不存在不报错 ####

 

 


# #################### remove 移除指定的元素,不存在则提示ERROR。 ####

 

做的是key的比较

a.discard(11111)
# #################### intersection 取出交集并赋值给cc #####
cc = a.intersection(b)
print(cc) # {11, 'oopp', 99, 22}
# #################### intersection_update 取出交集并赋值给A ####
a.intersection_update(b)
print(a) # {'oopp', 11, 99, 22}
# #################### isdisjoint 如果没有交集返回True,有交集为False ####
print(a.isdisjoint(b)) # False
se = {11,22,33,44}
be = {11,22}
# #################### issubset # 另一个集合是否包含此集合, 子序列 ####
print(be.issubset(se)) # True
# #################### issuperset # 这个集合是否包含另一个集合 父序列 ####
print(se.issuperset(be)) # True



# #################### pop # 移除并返回任意集合元素,如果集合为空,则引发KeyError ####

aaa = se.pop()  # 可以将移除的那个元素赋值给其他值 ####
print(aaa) # 33
# #################### symmetric_difference # 将se中存在的be不存在的,be不存在的se中存在的合并到了一起,赋值为dddd ####
dddd = se.symmetric_difference(be)
print(dddd) # {33, 99, 44, 77, 88}
cccc = se.symmetric_difference(be)
print(cccc) # {33, 99, 44, 77, 88}
# #################### symmetric_difference_update # 将se中存在的be不存在的,be不存在的se中存在的合并到了一起,赋值为se ####
se.symmetric_difference_update(be)
print(se) # {33, 99, 44, 77, 88}
# ##############################
se = {11,22,33,44,99}
be = {11,22,77,88}
# #################### union # 取并集 ####

 

 

 


tt = se.union(be)
print(tt) # {33, 99, 11, 44, 77, 22, 88}
# #################### update # 更新的时候,必须得是可迭代(Iterable) ####
|= 就等于update

 

 

se.update([666,888])
se.update(666,888)
print(se)
# ########################################################################################################

 

list 随着规模的增加,效率在往下走,

set 随着规模的增加,效率还是那样



 

 

 集合补充:

不可变集合:frozonset

 # 不考虑顺序的快速去重

 

#####有一篇介绍python集合的文章,写的很好
https://tw.saowen.com/a/ab713431b675abe3d71cf675d04082b9601135ba484291bb2b3a95b6ccad0e4f
posted @ 2018-11-30 17:50  运维小菜鸟的开发之路  阅读(2591)  评论(2编辑  收藏  举报