集合(set)可以看作是“只有键,没有值”的字典。在一个集合中,所有的键都是唯一的,因为集合不会包含重复的数据。这个特性使得集合经常用来去除重复的元素,或者判断元素之间是否有交集、并集或差集等关联性。
创建集合
集合由数字、字符串或布尔值组成,同一个集合中的元素可以是不同的类型。创建集合有两种方式:
set()
使用 set()
可以创建空集合,或者将列表、元组、字符串或字典转换成集合。使用方法为 set(要变成集合的元素)
。
如果创建时出现重复的元素,只会保留一个。如果是字典,只会保留键。如果是布尔值,True 等同于 1,False 等同于 0。
a = set() b = set([1,2,3,4,5,1,2,3,4,5]) c = set({'x':1,'y':2,'z':3}) d = set('hello') print(a) # set() print(b) # {1, 2, 3, 4, 5} 只留下不重复的部分 print(c) # {'x', 'y', 'z'} 如果是字典,只保留键 print(d) # {'l', 'o', 'h', 'e'} 只留下不重复的部分
大括号 {}
如果不是空集合,可以使用 {元素}
创建集合(单纯写大括号,会变成“空字典”)。
a = {0,1,2,3,'a','b',False} print(a) # {0, 1, 2, 3, 'a', 'b'} False 等同于 0,所以只保留 0
添加元素
使用 集合.add(元素)
可以将某个元素加入到集合中。下面的代码会将 x
和 y
两个字符串加入到 a
集合。
a = {0,1,2,3,4,5} a.add('x') a.add('y') print(a) # {0, 1, 2, 3, 4, 5, 'x', 'y'}
移除元素
有两种方法可以移除集合里的某个元素:
remove()
使用 集合.remove(元素)
可以将指定的元素移除,但如果该元素不存在,就会执行错误。
a = {0,1,2,3,'x','y','z'} a.remove('x') print(a) # {0, 1, 2, 3, 'y', 'z'}
discard()
如果不希望在移除元素时发生执行错误的情况,可以使用 集合.discard(元素)
移除指定元素。
a = {0,1,2,3,'x','y','z'} a.discard('x') a.discard('a') # 不会发生错误 print(a) # {0, 1, 2, 3, 'y', 'z'}
集合运算
交集、并集、差集、对称差集
集合有四种运算类型,分别是“交集、并集、差集、对称差集”。通过下图可以了解四种运算类型。
使用集合运算有两种方法,一种是使用特定的方法,另一种是使用“符号”(集合运算符)。
集合 | 方法 | 运算符 |
---|---|---|
交集 | a.intersection(b) | a&b |
并集 | a.union(b) | a|b |
差集 | a.difference(b) | a-b |
对称差集 | a.symmetricdifference(b) | a^b |
下面的代码对 a
和 b
进行集合运算。
a = {1,2,3,4,5} b = {3,4,5,6,7} # 交集 print(a.intersection(b)) # {3, 4, 5} print(a&b) # {3, 4, 5} # 并集 print(a.union(b)) # {1, 2, 3, 4, 5, 6, 7} print(a|b) # {1, 2, 3, 4, 5, 6, 7} # 差集 print(a.difference(b)) # {1, 2} print(a-b) # {1, 2} # 对称差集 print(a.symmetricdifference(b)) # {1, 2, 6, 7} print(a^b) # {1, 2, 6, 7}
子集合、超集合
假设有 A、B 两个集合,超集合和子集合的关系可以参考下图:
集合 | 说明 |
---|---|
超集合 | A 完全包含 B,A 和 B 所包含的元素可能完全相同 |
真超集合 | A 完全包含 B,且具有 B 没有的的元素 |
子集合 | B 完全被 A 包含,A 和 B 所包含的元素可能完全相同 |
真子集合 | B 完全被 A 包含,且 A 具有 B 没有的的元素 |
下面的代码中有四个集合,使用「大于、小于、等于」可以表示彼此的关系,从打印出的结果可以看到各个集合之间的关系。
a = {1,2,3,4,5,6,7} b = {3,4,5,6,7} c = {1,2,3,4,5,6,7} d = {6,7,8,9} print(a<=a) # True 自己是自己的子集合 print(b<=a) # True b 是 a 的子集合 print(b<a) # True b 也是 a 的真子集合 ( 因为没有等于,完全包含 ) print(c<=a) # True c 是 a 的子集合 print(a<=c) # True a 也是 c 的子集合 print(d<a) # False d 和 a 没有子集合或超集合关系
此外,使用「b.issubset(a)
」方法可以检查 b 是否为 a 的子集合、「a.issuperset(b)
」方法可以检查 a 是否为 b 的超集合。
a = {1,2,3,4,5,6,7} b = {3,4,5,6,7} c = {1,2,3,4,5,6,7} d = {6,7,8,9} print(b.issubset(a)) # True b 是 a 的子集合 print(a.issuperset(b)) # True a 是 b 的超集合 print(c.issubset(a)) # True c 是 a 的子集合 print(d.issubset(a)) # Fasle d 不是 a 的子集合
获取集合长度
使用 len(集合)
可以返回某个集合的长度(有多少个元素)。
a = {1,2,3,4,5,6,7} print(len(a)) # 7
检查元素是否存在
使用 元素 in 集合
可以检查集合中是否存在某个元素,如果存在则返回 True,不存在则返回 False(使用 元素 not in 集合
可以判断不存在)。
a = {'a','b','c','d',1,2,3} print('b' in a) # True print(2 in a) # True print(99 in a) # False
`黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取