字典的几个特点必须机制,无序,可变,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也可以