字典 dict
- key-value键值对的数据的集合
- 可变的、无序的(不可以索引)、key不重复
初始化


标识符赋值(最常用)

二元可迭代对象构建

后面跟引用类型[100]的时候是进行id拷贝创建(id一样)
元素访问

用key访问,数字,字符串和某情况下的的元组可以用哈希做key访问

set里面都是key,所以也报KeyError

增加和修改


添加
- 更新:用新的二元可迭代对象去更新原来的字典,进行元素比对,存在就覆盖,不存在就添加(不太常用)

字典也是可迭代的对象

字典是无序的
字典的删除

删除一般不会使用缺省值,容易产生误导
- pop弹出(返回键值对)

key的类型错误

弹出,会返回弹出的数值,但字典中已不存在
- 随机pop(返回值)


- del语句
Q:d = {'a':1, 'b':b, 'c':[1,3,5]} del d['c'] 是删除了一个对象[1,3,5]么?
A:元素对象仍存在,删除的是元素对象与其地址之间的关联关系,但表面上看起来是将字典中的元素对象删除了,本质上减少了一个对象的引用,del实际上删除的是名称而不是对象,删除本质上是交给GC的(Py中是这样,C++不一样)

删除的是标识符与地址两者之间的关联关系(引用计数减一)

b无法访问。成功删除,因为b指向的地址被忘记;d可以,因为其中的一个键值对还记录着对应值的地址


删除元素要慎重!一定要清楚自己要删除的是什么!
- clear可能会存在垃圾回收,要考虑好
字典的遍历
- 取key

- 取value



动态视图:(entry指的是item)字典发生变化,视图(提取内容)也发生变化,并且不占用内存

返回了一个可迭代的对象,你向我要数据,我再去原数据处再去取(视图),类似于range,并不会开辟内存来存储原数据的数据(不会产生内存的copy)


在for迭代的过程中,当你每次循环的时候用到了迭代对象的视图时,迭代对象的长度是不可以改变的(增删是不可以的,读和修改是可以的)

移除value是字符串的项:

迭代内记录,在迭代外删除

字典的key(去重) !!
key是为了便于快速查找的(纳秒级的,与set一样)

set是一种特殊的字典(可哈希=不可变)


value是不等长的list:

写法1

写法2
defaultdict (缺省字典,默认是null):

当访问某key并为其赋value值时,key并不在(KeyError),就按着defaultdict设定的要求建立:

字典添加是无序:


IPython3.5下版本无法保证顺序(mini_python)

不启动虚拟环境,直接指定

在其下面安装IPython
IPython中显示不出来:

直接启动Pyhton

3.6之后打印顺序就是输入的顺序
有序字典:(强于3.6特性)


初始化的过程的顺序是无法保证的,但是后添加的顺序是可以保证的:

有序是按照你的写入顺序来的

也可利用sort进行后排序替代
key可以自定义函数,比较强大!!

下面是关于一些字典练习我的写法,大家可以提出自己的想法,一起交流。

练习1

练习2

练习三的小部分知识点
















