【Devops】Python运维自动化之集合Set

news2024/12/28 20:19:59

集合Set

集合,简称集。由任意个元素构成的集体。高级语言都实现了这个非常重要的数据结构类型。
Python中,它是可变的、无序的、不重复的元素的集合。

hash表

Python中的集合(set)是基于哈希表(Hash Table)实现的,但严格来说,集合并不等同于哈希表,而是使用了哈希表的数据结构来实现其内部机制。

初始化

  • set() -> new empty set object
  • set(iterable) -> new set object
s1 = set()  #输出的就是 set()
s2 = set(range(5))
s3 = set([1, 2, 3])
s4 = set('abcdabcd')
s5 = {} # 这是什么? 输出的就是 {}
s6 = {1, 2, 3}
s7 = {1, (1,)}
s8 = {1, (1,), [1]} # ?报错 unhashable type: 'list' 翻译:不可哈希类型:‘list’

元素性质

  • 去重:在集合中,所有元素必须相异

  • 无序:因为无序,所以不可索引

  • 可哈希:Python集合中的元素必须可以hash,即元素都可以使用内建函数hash

    • 目前学过不可hash的类型有:list、set、bytearray
  • 可迭代:set中虽然元素不一样,但元素都可以迭代出来

#去重
输入:{*range(5),*[1,2,3]}
输出:{0, 1, 2, 3, 4}


#不可hash
{[1,2]},{{}},{{1}}
TypeError: unhashable type: 'list'
TypeError: unhashable type: 'dict'
TypeError: unhashable type: 'set'

增加

  • add(elem)
    增加一个元素到set中
    如果元素存在,什么都不做

  • update(*others)
    合并其他元素到set集合中来
    参数others必须是可迭代对象
    就地修改

s = set()
s.add(1)  #{1}
s.update((1,2,3), [2,3,4]) #{1,2,3,4}


x = set(1)  #{1}
x.add('abc') #{1,'abc'}
x.update('abc') #{1,'a','abc','b','c'}
x.update(['xyz']) #{'a', 'abc', 'b', 'c', 'xyz'}

删除

  • remove(elem)

    • 从set中移除一个元素
    • 元素不存在,抛出KeyError异常。为什么是KeyError? #唯一不重复
  • discard(elem)

    • 从set中移除一个元素
    • 元素不存在,什么都不做
  • pop() -> item

    • 移除并返回任意的元素。为什么是任意元素?
    • 空集返回KeyError异常
  • clear()

    • 移除所有元素
s = set(range(10))  #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s.remove(0)         #{1, 2, 3, 4, 5, 6, 7, 8, 9}
#s.remove(11) # KeyError为什么  KeyError: 11 没找到
s.discard(11)
s.pop()
s.clear()#清空

修改

集合类型没有修改。因为元素唯一。如果元素能够加入到集合中,说明它和别的元素不一样。
所谓修改,其实就是把当前元素改成一个完全不同的元素,就是删除加入新元素。

s = {1,2,3}
s.remove{2}
s.add{4}

索引

非线性结构,不可索引。

遍历

只要是容器,都可以遍历元素。但是效率都是O(n)

查询

s = {(1,),2}
1 in s,2 in s  #(False, True)


成员运算符in

 print(10 in [1, 2, 3])
 print(10 in {1, 2, 3})
 

 

上面2句代码,分别在列表和集合中搜索元素。如果列表和集合的元素都有100万个,谁的效率高?

答:集合

IPython魔术方法

IPython内置的特殊方法,使用%百分号开头的

  • % 开头是line magic
  • %% 开头是 cell magic,notebook的cell
%timeit statement 
-n 一个循环loop执行语句多少次
-r 循环执行多少次loop,取最好的结果
%%timeit setup_code
  * code.....
  
# 下面写一行,列表每次都要创建,这样写不好
%timeit (-1 in list(range(100)))
# 下面写在一个cell中,写在setup中,列表创建一次
%%timeit l=list(range(1000000))
-1 in l


#这里,%timeit会测量检查-1是否存在于由range(100)生成的集合中的总时间。注意,由于set(range(100))在每次迭代时都会重新创建,这可能会影响性能测量的准确性,因为创建集合本身也是有时间开销的。
%timeit (-1 in set(range(100)))


#当您使用%%timeit时,它会对一个代码块(由多行组成)进行多次执行,并返回每次执行的平均时间。它非常适合测量包含多个语句的代码段的性能。
 %%timeit  x=set((range(100)))
 -1 in x

set和线性结构比较

%%timeit x=list(range(100))
-1 in x
669 ns ± 24.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%%timeit x=list(range(1000000))
-1 in x
6.19 ms ± 267 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit x=set(range(100))
-1 in x
22.2 ns ± 1.4 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

%%timeit x=set(range(1000000))
-1 in x
20.6 ns ± 3.74 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

结果说明,集合性能很好。为什么?

  • 线性数据结构,搜索元素的时间复杂度是O(n),即随着数据规模增加耗时增大
  • set、dict使用hash表实现,内部使用hash值作为key,时间复杂度为O(1),查询时间和数据规模无
    关,不会随着数据规模增大而搜索性能下降。

可哈希

  • 数值型int、float、complex
  • 布尔型True、False
  • 字符串string、bytes
  • tuple
  • None
  • 以上都是不可变类型,称为可哈希类型,hashable

set元素必须是可hash的.

在这里插入图片描述

集合概念

  • 全集
  • 所有元素的集合。例如实数集,所有实数组成的集合就是全集
  • 子集subset和超集superset
  • 一个集合A所有元素都在另一个集合B内,A是B的子集,B是A的超集
  • 真子集和真超集
  • A是B的子集,且A不等于B,A就是B的真子集,B是A的真超集
  • 并集:多个集合合并的结果
  • 交集:多个集合的公共部分
  • 差集:集合中除去和其他集合公共部分

并集

在这里插入图片描述

将两个集合A和B的所有的元素合并到一起,组成的集合称作集合A与集合B的并集

  • union(*others) 返回和多个集合合并后的新的集合
  • | 运算符重载,等同union
  • update(*others) 和多个集合合并,就地修改
  • |= 等同update
|  运算符重载,等同union
a = set(range(5))
b = set(range(5,10))
输入:a | b 
输出:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}


|= 等同update
a = set(range(5))
b = set(range(5,10))
输入:a |= b
     a,b
输出:({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {5, 6, 7, 8, 9})

交集

在这里插入图片描述

集合A和B,由所有属于A且属于B的元素组成的集合

  • intersection(*others) 返回和多个集合的交集
  • & 等同intersection
  • intersection_update(*others) 获取和多个集合的交集,并就地修改
  • &= 等同intersection_update
& 等同intersection
a = set(range(5))
b = set(range(3,7))
输入:a & b,a,b
输出:({3, 4}, {0, 1, 2, 3, 4}, {3, 4, 5, 6})

&= 等同intersection_update
a = set(range(5))
b = set(range(3,7))
输入:a &= b
     a
输出:{3, 4}

差集

在这里插入图片描述

集合A和B,由所有属于A且不属于B的元素组成的集合

  • difference(*others) 返回和多个集合的差集
  • ‘-’ 等同difference
  • difference_update(*others) 获取和多个集合的差集并就地修改
  • -= 等同difference_update
- 等同difference
a = set(range(5)) #{0,1,2,3,4}
b = set(range(3,7)) #{3,4,5,6}
输入:a - b
输出:{0, 1, 2}

-= 等同difference_update
a = set(range(5))
b = set(range(3,7))
输入:a - b
     a
输出:{0, 1, 2}   


#difference(*others) 返回和多个集合的差集
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
 
# 计算 set1 和 set2 的差集
result = set1.difference(set2)
print(result)  # 输出: {1, 2, 3}

对称差集

在这里插入图片描述

集合A和B,由所有不属于A和B的交集元素组成的集合,记作(A-B)∪(B-A)

  • symmetric_differece(*other) 返回和另一个集合的对称差集
  • ^ 等同symmetric_differece
  • symmetric_differece_update(*other) 获取和另一个集合的对称差集并就地修改
  • ^= 等同symmetric_differece_update
#^ 等同symmetric_differece
a = set(range(5)) #{0,1,2,3,4}
b = set(range(3,7)) #{3,4,5,6}
输入:a ^ b
输出:{0, 1, 2, 5, 6}

#^= 等同symmetric_differece_update
a = set(range(5))
b = set(range(3,7))
输入:a ^= b
	 a
输出:{0, 1, 2, 5, 6}

其它集合运算

  • issubset(other)、<= 判断当前集合是否是另一个集合的子集
  • set1 < set2 判断set1是否是set2的真子集
  • issuperset(other)、>= 判断当前集合是否是other的超集
  • set1 > set2 判断set1是否是set2的真超集
  • isdisjoint(*other) 当前集合和另一个集合没有交集,没有交集,返回True
#issubset(other)、<= 判断当前集合是否是另一个集合的子集
a = set(range(5))
b = set(range(3,7))
输入:a.issubset(b)
输出:False

a = set(range(5)) #{0,1,2,3,4}
b = set(range(7)) #{0,1,2,3,4,5,6}
输入:a.issubset(b)
输出:True

#set1 < set2 判断set1是否是set2的真子集
a = set(range(5))
b = set(range(7))
输入:a < b
输出:True

#issuperset(*other)、>= 判断当前集合是否是other的超集
a = {1, 2, 3, 4}
b = {1, 2}
c = {3, 4}

print(a.issuperset(b))  # 输出: True
print(a.issuperset(c))  # 输出: True
print(a.issuperset(b, c))  # 抛出 TypeError,因为 issuperset 不接受多个集合作为位置参数(除非它们被打包成一个可迭代对象)
print(a.issuperset([1, 2, 5]))  # 输出: False,因为 5 不在 a 中

#isdisjoint(*other) 当前集合和另一个集合没有交集,没有交集,返回True
a = set(range(5))
b = set(range(5,7))
输入:a.isdisjoint(b)
输出:True

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

x64dbg 安装使用教程

x64dbg的安装与配置 x64dbg官网地址&#xff1a;https://x64dbg.com/#start x64dbg界面介绍 1.反汇编窗口 这个位置显示的是需要分析的程序的反汇编代码。在第一个区域的最左侧例如“7712EAA3”这一列就是内存地址区域&#xff0c;接着“E8 07”就是汇编指令的opcode&#xff…

CH343等第3代USB串口芯片常见问题解答

一、概述 CH343、CH9101、CH9102等系列芯片&#xff0c;是沁恒推出的第三代USB转单串口产品&#xff0c;基于经典版CH340系列芯片进行技术革新&#xff0c;实现USB转高速异步串口&#xff0c;波特率支持最高6Mbps。芯片内部高度集成&#xff0c;外围精简&#xff0c;均提供VIO…

npm安装-详细教程

npm安装教程 第一章 Vue学习入门之 Node.js 的使用 文章目录 npm安装教程 [TOC] 前言一、npm是什么&#xff1f;二、安装、配置环境变量 1.下载并安装NodeJS2.npm配置 前言 随着时代的不断发展&#xff0c;前端学习这门技术也越来越重要&#xff0c;很多人都开启了学习前端…

【Web】2024“国城杯”网络安全挑战大赛题解

目录 Ez_Gallery 法一&#xff1a;shell盲注 法二&#xff1a;反弹shell 法三&#xff1a;响应钩子回显 Easy Jelly 法一&#xff1a;无回显XXE 法二&#xff1a;Jexl表达式RCE signal 法一&#xff1a;SSRF 法二&#xff1a;filterchain RCE Ez_Gallery 用这个bp验证…

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!

在这个人工智能迅猛发展的时代&#xff0c;AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水&#xff1f;每款AI都有其独特的魅力与优势&#xff0c;那么&#xff0c;究竟哪一款AI聊天助手最适合你呢&#xff1f;本文将带…

Visual Studio Community安装WebForm创建和数据连接

目录 一、安装Visual Studio Community 1.下载Visual Studio Community 2.双击安装 3.配置 二、项目创建 1.创建新项目 2.配置新项目 3.创建web窗体 4.代码分部 5.文件打开问题 三、数据库访问 1.自己先装一个sql server 2.创建实体数据模型 3.创建连接 4.修改更…

第二篇:脚手架搭建 — React 和 Express 的搭建

目录 1 React搭建2 Express搭建总结 第一篇我们介绍了开发环境的搭建过程&#xff0c;介绍了vscode、git、nodejs和mongodb的安装过程。有了基础的开发环境就需要搭建我们的前后端脚手架了。 1 React搭建 前端我们选用React框架解决界面的渲染和用户交互的问题&#xff0c;Rea…

对深度学习中的LayerNorm层重用问题的深入剖析

深度学习中的归一化技术是提升模型性能和训练稳定性的重要利器。在众多归一化方法中&#xff0c;LayerNorm (层归一化)以其独特的优势在自然语言处理等领域得到广泛应用。然而&#xff0c;在实际开发中&#xff0c;一个常见的误区是尝试重用LayerNorm层&#xff0c;这不仅会影响…

互联网、物联网的相关标准

互联网的相关标准 网络通信协议&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff1a;用于在网络中传输文本、图像、音频和视频等数据的协议。它基于请求-响应模型&#xff0c;客户端发送请求给服务器&#xff0c;服务器返回响应。HTTPS&a…

PageHelper自定义Count查询及其优化

PageHelper自定义Count查询及其优化 文章目录 PageHelper自定义Count查询及其优化一&#xff1a;背景1.1、解决方法 二&#xff1a;利用反射判断请求参数是否有模糊查询2.1、分页不执行count2.2、思路2.3、代码示例 三&#xff1a;自定义COUNT查询SQL(只适用于单表)3.1、局限性…

【洛谷】P1223 排队接水(思路详解)

#include <iostream> #include <algorithm> #include <iomanip> using namespace std;int main() {//1. 从标准输入读取人数n&#xff0c;对应题目中在水龙头前排队接水的人数int n; cin >> n;//2. 定义数组N&#xff0c;用于存储每个人接水的时间&am…

WebDAV服务不能上传大文件,文件超过50M报错[0x800700DF]怎么办?

这个问题需要分别从服务端和客户端解决。 1.Windows客户端 解除50M文件限制&#xff0c;Windows访问Webdav服务时&#xff0c;大于50M文件提示错误[错误:0x800700DF] 部署了webdav&#xff0c;Windows10映射网络磁盘&#xff0c;传输文件超过大约50MB的文件会弹出“0x800700…

计算机视觉:学习指南

一、引言 计算机视觉作为人工智能领域的一个重要分支&#xff0c;致力于让计算机理解和解释视觉信息&#xff0c;近年来取得了令人瞩目的进展&#xff0c;广泛应用于安防监控、自动驾驶、图像编辑、医学影像分析等众多领域。从入门到精通计算机视觉需要系统地学习一系列知识和…

vue3-canvas实现在图片上框选标记(放大,缩小,移动,删除)

双图版本&#xff08;模板对比&#xff09; 业务描述&#xff1a;模板与图片对比&#xff0c;只操作模板框选的位置进行色差对比&#xff0c;传框选坐标位置给后端&#xff0c;返回对比结果显示 draw.js文件&#xff1a; 新增了 createUuid&#xff0c;和求取两个数组差集的方…

StarRocks-hive数据类型导致的分区问题

背景&#xff1a; 有个hive的表&#xff0c;是月分区的&#xff08;month_id&#xff09;&#xff0c;分区字段用的是string类型。数据量比较大&#xff0c;为了保证计算性能&#xff0c;所以把数据导入到SR里&#xff0c;构建一个内部表。但是在建表的时候想使用月分区使用pa…

Flume——进阶(agent特性+三种结构:串联,多路复用,聚合)

目录 agent特性ChannelSelector描述&#xff1a; SinkProcessor描述&#xff1a; 串联架构结构图解定义与描述配置示例Flume1&#xff08;监测端node1&#xff09;Flume3&#xff08;接收端node3&#xff09;启动方式 复制和多路复用结构图解定义描述配置示例node1node2node3启…

嵌入式学习(15)-stm32通用GPIO模拟串口发送数据

一、概述 在项目开发中可能会遇到串口不够用的情况这时候可以用通过GPIO来模拟串口的通信方式。 二、协议格式 按照1位起始位8位数据位1位停止位的方式去编写发送端的程序。起始位拉低一个波特率的时间&#xff1b;发送8位数据&#xff1b;拉高一个波特率的时间。 三、代码 …

【Go系列】:全面掌握 Sentinel Go —— 构建高可用微服务的流量控制、熔断、降级与系统防护体系

前言 在现代分布式系统架构中&#xff0c;服务的稳定性和可用性是至关重要的。随着微服务和云原生技术的发展&#xff0c;如何有效地进行流量控制、熔断降级以及系统保护成为了一个关键课题。Sentinel 是阿里巴巴开源的一款面向分布式服务架构的流量控制组件&#xff0c;它不仅…

多模态RAG:通用框架方案调研汇总

阅读原文 多模态检索增强生成是一种新兴的设计范式&#xff0c;允许AI模型与文本、图像、视频等存储进行交互。在介绍多模态 RAG 之前&#xff0c;我们先简单了解一下传统的检索增强生成 (RAG)。 标准 RAG RAG 的理念是找到与用户查询相关的核心信息&#xff0c;然后将该信息…

《HTML 的变革之路:从过去到未来》

一、HTML 的发展历程 图片: HTML 从诞生至今&#xff0c;经历了多个版本的迭代。 &#xff08;一&#xff09;早期版本 HTML 3.2 在 1997 年 1 月 14 日成为 W3C 推荐标准&#xff0c;提供了表格、文字绕排和复杂数学元素显示等新特性&#xff0c;但因实现复杂且缺乏浏览器…