2019/09/23 05-Set操作和hash

在这里插入图片描述
python的内置数据结构set
约定:
set翻译为集合
collection 翻译为集合类型,是一个大概念(集合类型,列表,元组,set,字典,全部在内)
是一个大概念,容器,等于是乱放的

set:
可变的,无序的,不重复的元素的集合,无序是可以迭代的,set集合是一个没有顺序,但是是可以迭代的数据结构,是可变的,
bytes,元组,字符串,不可变
列表,bytearray,可变
set非常重要的一点,就是去重的

set可以使用()括号,空set
还有可迭代对象iterable
在这里插入图片描述
大括号{}
在这里插入图片描述
这是个特例,定义字典
在这里插入图片描述
再执行一次看s的类型在这里插入图片描述在这里插入图片描述
所以所有puthon定义空set只能set()
在这里插入图片描述
set以为这里面是可迭代对象,就一个个传给s1
在这里插入图片描述
内容可以重复,但是内容不会把重复的去掉,但是认为内容是相同的,在这里插入图片描述
set就是把之前内容重复的都去重,这里面的1,2,3依然称为元素在这里插入图片描述
这样就可以理解为所谓的无序,用列表绝对不会这样
但是看起来是无序,但是计算机内部都是有序的,只不过是按照它自己的顺序给你看你,你觉得无序

在这里插入图片描述在这里插入图片描述
得到一个列表,再转换成set,经常做的东西,只要转成set,一定会按照set方式去去重
在这里插入图片描述
这个是字典
在这里插入图片描述
集合和集合并在一起,在数学上叫并集在这里插入图片描述
乘了一点意思也没有,因为需要去重在这里插入图片描述在这里插入图片描述
但是不能再add后面+add,因为add返回值是nonetype在这里插入图片描述
加个字符串试试
在这里插入图片描述
unhashable代表不能放进来,没法给你发房间号,hash本质上是吧元素放在一个散列值中,这个散列值就是计算出来的一个房间号,把1哪来做hash,hash就是散列值的意思,hash得到散列值就是一个门牌号,301,就把1这个值到301房间去,
ab算出来407,就到407去住,遇到列表,就说不支持列表,算不出来门牌号,拒绝让你入住

在这里插入图片描述
加集合,告诉你不可hash类型set,到目前为止,列表和set是不能作为set的元素的在这里插入图片描述
虽然值一样但是类型不一样,去不了重
在这里插入图片描述
列表就加不进去,因为要计算hash值,要把所有元素遍历一遍,列表直接给你报错,hash不了
在这里插入图片描述
hash是个内建函数,下面可以理解为内存中的地址,门牌号,算出来的是完全不一样的
如果要找1,那你就把1再hash一次就找到门牌号了

在这里插入图片描述
所以这样的查询方式,时间复杂度是一步到位O(1).,算一下hash值即可
在这里插入图片描述
hash是内建函数,能不能hash用它来试试即可在这里插入图片描述
列表不可以hash
在这里插入图片描述
set不可以hash
在这里插入图片描述
字典不可以hash,看见{}大括号都不能在这里插入图片描述
中括号包括,列表,大括号包括字典和set都不能hash,这三样不可以hash,其他都可以

定义集合的时候,无序的去重的,可迭代的,可变的

这个就不行,看见中括号了
在这里插入图片描述在这里插入图片描述
set元素要求里面的元素必须可以hash
目前学过的不可hash的类型有list,set,还有字典
元素不可以索引(因为是无序的,是拿hash值来找的)
set可以迭代
在这里插入图片描述在这里插入图片描述
add加单个元素,加set和列表都加不进去,能加进去的也就元组,字符串了,在这里插入图片描述
update(others)
合并其他元素到set集合中来
在这里插入图片描述
作为一个整体增加
在这里插入图片描述
这么加元素根本不变
在这里插入图片描述
还有另外一种加法
把可迭代对象,一个个加进去了
在这里插入图片描述
123有了加个4即可,这是就地修改在这里插入图片描述
** *args可以,相当于旁边的元组遍历这个元组,,
*在这里插入图片描述
先拿它,看到是可迭代对象,就迭代,把里面1234取出来,分别add到set来在这里插入图片描述
把后面的range也迭代,0,12,3,4分别加到s2,应该是多个0出来在这里插入图片描述
这样就可以好多集合扩展在s2上,可以用列表,可以用可迭代对象,但是要求,可迭代对象里面,一定要可hash,不可hash就 不行
在这里插入图片描述在这里插入图片描述在这里插入图片描述
报的是valueerror
在这里插入图片描述
在set s2中remove,表明实现机制上是跟列表不同的
在这里插入图片描述
key其实把里面每个元素当key来加在这里插入图片描述
从s2移除试试,频繁的删除增加代价会大一些,所以remove这样的操作少做
set的代价比列表小,因为列表牵扯到数据挪动

在这里插入图片描述
但是remove元素,如果这个元素不存在,就报keyerror,所以给了discard函数
在这里插入图片描述
discard也是移除,但是元素不存在,就什么都不做,不抛出异常
在这里插入图片描述
在内存中存放的数据,来之不易,都是从磁盘,从网络IO获取的,处理的时候最好想想真的有必要频繁地移除吗

pop从集合里给你弹出一个数据,随机给你弹一个元素出来
在这里插入图片描述在这里插入图片描述
pop出来的是不一定的,但是是可以拿到的
set集合不索引

在这里插入图片描述
内存中的数据来之不易,谨慎删除
在这里插入图片描述在这里插入图片描述
所谓的修改是看到你要的目标在不在,没有必要修改,没有你就新增进去
在这里插入图片描述
非线性结构无法索引,内存的编制其实是连续的,通过hash算法散开了,散列
在这里插入图片描述
1号房,2号房出来,只要是集合类型(列表,元组,set,字典dict)都支持索引,但是不是都支持索引(线性结构用索引,非线性结构算hash)
遍历是你知道哪些房间有客人,让你出来

在这里插入图片描述
下面是不推荐的操作
-1肯定在lst2
一个是毫秒一个是微妙,差了1000倍
在这里插入图片描述
纳秒级的,数据规模增加了,你在什么环境下用什么查询,如杠数据规模i很大,那么就用set、和list在这里插入图片描述数据规模不大的话可以用list,大一点的话可以用set(直接hash一下,就知道门牌号是多少了,复杂度是O(1))
但是它的时间都是从空间换来的,它用了比你数据更大的空间,还有个散列空间,也就是十层楼住了两个客户,它也有空间,但是列表就连续给你两空间就够了
它的这些东西其实都是空间换时间换来的
在这里插入图片描述
列表是小规模可以使用,如果数据上千上万了,该换set了

别人问set有什么特点,
1.去重
2.散列,无序的
3.可迭代,非线性
4.可hash(不可hash的,中括号大括号,列表,set,字典)

我们在使用in的也是使用了set特点,hash完之后去找在不在在这里插入图片描述
比较的结果。set是直接hash的,速度是纳秒级的在这里插入图片描述在这里插入图片描述
线性结构的查询时间复杂度是随着规模的增大而增加,是大O(n)在这里插入图片描述
set和字典内部使用的散列值,也就是hash,把hash值作为key,唯一的门牌号,所以时间复杂度可以做到大O(1),查询时间和数据规模无关,如果还继续问,就告诉散列值是一个超大的散列值空间,(一个酒店有很多房间,但实际住人的就两个)在这里插入图片描述
可hash的类型:
数值型:int,float,complex
布尔型:true,false
字符串:string,bytes(字符串的变化是生成一个新的字符串,原字符串并没有改变)
tuple
none 常量值,就是none类型,就一个值
以上都是不可变类型,成为可哈希类型,hashable
list,字典,set可变都不能hash

在这里插入图片描述
再次理解为i复杂类型和简单类型,复杂类型放的是地址,门牌号,虽然增加了2,但是门牌号并没有改变,地址并没有改变
在这里插入图片描述
**元组可变不可变实际上指的是元素的地址存放空间
这里面的3是不可变,[1]可以理解为地址是不变的
**
在这里插入图片描述在这里插入图片描述
无顺序的,可以理解为住酒店,没有挨着住一起,
不重复,去重这一点是非常重要,问set必提

在这里插入图片描述在这里插入图片描述
这个就变成字典了,空字典是set{}
在这里插入图片描述在这里插入图片描述在这里插入图片描述
add增加一个元素
update是把可迭代对象,每个元素迭代出来后,挨个添加到集合当中,集合顺带帮你去重

想去重很简单,建一个空集合,把几个可迭代对象塞到里面去,得到的就是去过重的在这里插入图片描述
在这里插入图片描述
遍历不管效率,都需要走一遍
在这里插入图片描述
hash、是找门牌号,真正的元素是放门牌号里面的
在这里插入图片描述在这里插入图片描述
**试一下bytearray可否hash
b’'代表bytes,凡是可变的都不可hash
**在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值