前言

本文承接上文

集合

python中的集合,和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。

同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型

集合的特点

  1. 去重,把一个列表变成集合,就自动去重了。
  2. 关系测试,测试两组数据之前的交集、差集、并集等关系。

创建集合

直接创建或者set创建

set1 = set({1,2,'hello'})
set2 = {1,2,'hello'}
print(set1,set2)
print(type(set1),type(set1))

运行结果为

{1, 2, 'hello'} {1, 2, 'hello'}
<class 'set'> <class 'set'>

增加操作

增加有add,update两种方法

而update将一个集合中的元素添加到当前集合中
update可以传递序列或字典作为参数,字典只会使用键

set1 = {'a','b','c','d'}
set1.add('e')
print(set1)



set1.update('A')
print(set1)
set1.update('E')
print(set1)
set1.update({10:'ab',20:'bc',100:'cd',1000:'ef'})
print(set1)

运行结果为

{'a', 'e', 'd', 'b', 'c'}
{'a', 'e', 'd', 'b', 'A', 'c'}
{'a', 'e', 'd', 'b', 'A', 'c', 'E'}
{'a', 1, 2, 3, 'e', 'd', 'b', 'A', 'c', 'E'}

删除操作

集合的删除方法有和其他序列的删除方法基本一致,pop和remove,del这里就不多写了

修改操作

集合是不可变的数据类型,不存在修改

查找操作

由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素。Python 中,访问集合元素最常用的方法是使用循环结构,将集合中的数据逐一读取出来。

set1 = {'a','b','c','d'}
for i in set1:
print(i)

运行结果为

a
d
b
c

哈希(hash)是什么

之前提到了可变数据类型和不可变数据类型,是根据能不能就行hash来决定了

而hash是什么

简单的来说哈希是一种算法

哈希算法,它的输入可以是字符串,可以是数据,可以是任何文件,经过哈希运算后,变成一个固定长度的输出,该输出就是哈希值。但是哈希算法有一个很大的特点,就是你不能从结果推算出输入,所以又称为不可逆的算法

哈希特性

不可逆:在具备编码功能的同时,哈希算法也作为一种加密算法存在。即,你无法通过分析哈希值计算出源文件的样子,换句话说:你不可能通过观察香肠的纹理推测出猪原来的样子。

计算极快:200G高清电影和一个50K文本文件复杂度相同,计算量都极小,可以在0.1秒内得出结果。也就是说,不管猪有多肥,骨头多硬,做成香肠都只要眨眨眼的时间,

哈希的用途

哈希算法的不可逆特性使其在以下领域使用广泛

  1. 密码,我们日常使用的各种电子密码本质上都是基于hash的,你不用担心支付宝的工作人员会把你的密码泄漏给第三方,因为你的登录密码是先经过 hash+各种复杂算法得出密文后 再存进支付宝的数据库里的
  2. 文件完整性校验,通过对文件进行hash,得出一段hash值 ,这样文件内容以后被修改了,hash值就会变。 MD5 Hash算法的”数字指纹”特性,使它成为应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
  3. 数字签名,数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

哈希和字典与集合的关系

而python里和hash有关的数据类型就是dict和set

字典查询速度快的原因就是因为字典中的key进行了key处理

简单来说

当你存大量数据的时候

data = {
"张三":[23742364782642342323234,28,"山东济南"],
"李四":[12124234232311214458271,25,"北京昌平"],
"王五":[23030293483727384383929,33,"山东济南"],
"赵六":[42302033030302482634674,28,"河北保定"],
....
}


字典的key都会进行hash处理而hash处理后的值会被按顺序排列在一个列表里

而当需要查找这个hash值的时候,通过算法去快速找到这个需要的hash值(大概是这样的,真实hash算法更加复杂)

而这个查找速度是极快的,这也就是为什么字典查找快的原因了

同时字典插入慢的原因也是这样,因为在生成hash值的时候需要按顺序去放入列表中,所以和列表之类的相比插入速度也就慢了

而集合为什么是去重的原因也是这样

每存一个值到set里时, 都要先经过hash,然后通过得出的这个hash值算出应该存在set里的哪个位置,存的时候会先检查那个位置上有没有值 ,有的话就对比是否相等,如果相等,则不再存储此值。 如果不相等(即为空),则把新值 存在这。

本文到此结束,下文静等更新…(未完待续)

(下文更新文件操作)

感谢你的阅读