2019/09/24 03-字典遍历和删除注意事项

在这里插入图片描述
字典的几个特点必须机制,无序,可变,key不重复,要求key必须是可hash的,key是去重的,可迭代的在这里插入图片描述
键值对构成的,所以要么是空的,要么就2个2个赋值,要么是键值对,要么就传二元组,两个两个给
下面的用的多
在这里插入图片描述在这里插入图片描述
通过key来访问value,读取不到说明key不存在,直接抛异常,keyerror
在这里插入图片描述
不抛出异常,也是最常用的方法,输入key,如果能找到就返回值,找不到,默认返回none,如果给了缺省值,就返回缺省值
在这里插入图片描述
缺省值就是在没有值的时候补的,setdefault用的相对较少,set之后会放回当前key对应的值,没有key就帮你创建,给了缺省值就用缺省值,没有就 none,最后kv对有了,就返回给你value在这里插入图片描述在这里插入图片描述
如果原来的就覆盖调,没有就新增kv对
在这里插入图片描述
update就是可以用一个字典构建一个新的字典,也可以用二维元组的序列来构建一个,也可以A=XX,B=XX,传参的方式构造起来
如果原有字典有同名的key存在,相当于覆盖,如果原字典没有key,相当于新建kv对,都是靠key的hash来存地址
在这里插入图片描述在这里插入图片描述
字典可以删除,clear全部删除一个不留
在这里插入图片描述
pop要指定key,要移除哪个key
key存在,移除,并返回它的value
key不存在,就返回给定的default
default未设置,key不存在就抛出以上,keyerror

在这里插入图片描述
popitem()
移除并返回一个任意的键值对
字典为empty,抛出keyerrot异常

在这里插入图片描述
需要给定key
在这里插入图片描述
返回一个value
在这里插入图片描述
找不到d在这里插入图片描述
不想抛出异常就指定值
在这里插入图片描述
如果有,返回原来的value,没有就用缺省值在这里插入图片描述
POPITEM,不要参数,告诉你返回 一个kv对在这里插入图片描述
往往kv对是个元组
在这里插入图片描述
是毫无规律的,随机从里面拿kv,pop是随机从里面弹出等于移除在这里插入图片描述
好不容易放到集合的数据,确定要清空,否则不要clear
在这里插入图片描述在这里插入图片描述
定义三个东西
在这里插入图片描述
名字被你删除了就找不到了,是引用计数-1,但是如果True的引用计数并没有减完,垃圾回收就不会回收,等于删掉一个变量
在这里插入图片描述
在删除的过程中把变量删除了在这里插入图片描述
原来这么定义不是定义一个b,而是把b引用的对象地址塞进来,把b对象删了,但是d里面的引用地址还在
在这里插入图片描述
这么删除依然是把,通过key,把【1,3,5】确实从字典清除了,是kv对一起删除,相当于字典少了个kv对,但是并不是真的把【1,3,5】删了,如果这个列表的引用计数归0,则gc回收,依然相当于【1,3,5】把这个对象的引用计数-1
在这里插入图片描述在这里插入图片描述
虽然对象还在,但是b的标识符被你彻底清除了在这里插入图片描述
现在重新定义就有三个引用计数在这里插入图片描述
del实际上删的是对象的引用计数,在python中对象是在内存中实实在在的结构,是删除不掉的,是减引用计数在这里插入图片描述在这里插入图片描述
因为字典是键值对构成,遍历分三种
1.遍历键
2.遍历值
3.遍历键值对

这两个是等效的
在这里插入图片描述在这里插入图片描述
这就是对key的遍历,返回的是一个可迭代对象在这里插入图片描述

、、values也可以在这里插入图片描述
一个items就是一个kv对,kv对是用元组来表示
在这里插入图片描述在这里插入图片描述在这里插入图片描述
可以拿到key;来遍历value
在这里插入图片描述在这里插入图片描述
这两种都是kv对,只不过不是元组了在这里插入图片描述在这里插入图片描述
item是一个二元组,每一个item都是二元组,是kv对在这里插入图片描述
不拆就是item,在这里插入图片描述
要key就是item【0】,value就是1在这里插入图片描述在这里插入图片描述在这里插入图片描述
有时候也这么写,但是没必要
在这里插入图片描述
在python中对于容器的迭代基本上都是for循环在这里插入图片描述在这里插入图片描述
有时候这块可以有人顺便在这里把values解构
在这里插入图片描述
set要遍历,list要遍历,元组遍历,容器要么是这些,要么是可以修改的
set进行修改还算高效
但是有时候列表修改的话,要挪动所有元素不如重新创建
在这里插入图片描述在这里插入图片描述
python3中、key,values、items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中
dictionary view对象,可以使用len(),iter()、in操作
字典的entry的动态的视图,字典变化,视图将反映出这些变化
keys返回一个set对象,也就是可以看作一个set的集合。如杠values都可以hash,那么items也可以看作是类set对象
在这里插入图片描述
在python2中,keys,values,items都是立即返回一个新列表,原来的有多少元素,内存中肯定还会再占一份出来,但是python2也提供了三个方法不占多余的空间
iterkeys
itervalues
iteritems
这三个跟python3中的keys,values,items的行为是一样的
在这里插入图片描述
还是使用原来字典中的位置,不会复制到内存中在这里插入图片描述
这个dictionary view对象可以使用长度,
在这里插入图片描述
len可以知道有多少项
在这里插入图片描述
1 in 在不在这个key里
在这里插入图片描述
kv对往往成为entry,改变什么看到什么
在这里插入图片描述
返回一个对象可以当set用,key其实就是set,也是去重的,set有什么方法,keyt也有什么方法
values不可以当set使用,values是可以相同值的
在这里插入图片描述
如果values都可以hash,大不了就去重,有列表就不行了,但凡里面有一个不可hash对象,你的set转换就失败了
在这里插入图片描述
items返回一个二元组,这些items每个key都不一样,只要里面对象都可以hash就都可以当set使用在这里插入图片描述
字典是一个个kv对,只要字典里面有,值相同,但是key肯定不相同
keys可以当set用
items可以当set用 ,但是有前提,values是可以hash的

在这里插入图片描述
知道keys,vlues,items三个方法返回一个可迭代对象,这些方法是可以使用len(),iter(),in操作的。
keys返回一个类set对象,
在这里插入图片描述在这里插入图片描述
如何去移除元素(之前是clear,pop,popitem)

在迭代的过程中,字典不能被改变,在迭代的时候,要控制你的长度,因为在迭代的时候已经知道你的长度了,不能随便pop
在这里插入图片描述
在遍历里列表的过程中,能不能顺带改变长度
下面是remove,但是remove没有干净
因为在remove的时候,长度发生变化,不知道迭代几个,列表是允许在迭代过程中移除元素的,长度改变的
但是for循环,在移除的时候就有问题了
在这里插入图片描述
试试用while循环
在这里插入图片描述
字典为什么remove不干净
下面相当于使用keys,返回一个dictionary view对象,这个东西一罩子,里面的元素可以修改,但是增删不允许,因为增删会引起长度变化

在这里插入图片描述
现在的k是int,不能直接删除int
在这里插入图片描述
在迭代过程不允许改变长度,一般删除字典不能在这种for循环里删除
在这里插入图片描述
一般在迭代的时候要删除字典,先把keys记录下来,append进去,下面就是pop k
for循环迭代的时候往往用的是 key,values,items,在迭代的时候增加删除元素是做不到的,因为长度是不允许改变的
只能想办法把你要的key记录下来,然后逐个去删除
在这里插入图片描述
对列表就没有这个限制,在迭代的时候可以增加删除,但是长度改变对于for循环会带来很大问题,删除了还剩下几个是猜不到的
所以一般要在遍历的时候,要删除的话,不用for循环,用while,
在这里插入图片描述
更常用的是下面的
等效 false(d:)=空字典,空列表,空元组,none,,空字符串,四大皆空

在这里插入图片描述
正确的是,记录这些key,删除这些key在这里插入图片描述
字典的遍历和移除在这里插入图片描述
字典key的要求和set的要求是一致的,set的元素可以看作是key,value可以看作是一个常数,set可以看作是一个简化版的字典,set其实跟字典是统一的,set可以理解为隐藏起来不给你调用的字典,set的元素就是key,keys的方法返回就是set
在这里插入图片描述
bytes,bytearray也可以在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值