python set去重时间复杂度_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]

list01 = set(list01)

print(list01,type(list01))

# {1, 4, 5, 6, 7, 8}

基本概念:

全集

所有元素的集合,

子集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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值