4.字典
4.1字典的简介
字典类似于java中hashmap,它的数据都是以key(键)-value(值)配对的形式储存的。这种key-value的结构也被称为映射。只用输入特定的key,就能获得对应的value。例如一个电话本的字典,以名字为key,电话号码为value。当输入名字时,就能直接获得用户的电话号码。
4.2创建和使用字典
以:分隔key和value,以逗号分隔key-value pair。以大括号括起来。字典的key是唯一的,换句话说,不能有相等的key,但是value的值可以一样。要用key来获得value,不要像前面几章提到的列表或者元组用index。
4.2.1dict函数
可以通过dict函数用其他映射(比如字典)或者(键,值)的序列建立字典。
4.2.2基本字典操作
很多操作与序列类似(下面的d代表字典):
1.len(d):返回d中的key-value pair
2.d[k]:返回key为k的value。如果k不存在则报错。
3.d[k]=v:将value v关联到key k上。假如k不存在,将添加,假如已经有值关联到k上,旧值会被v重写。
4.del d[k]:删除key为k的key-value pair。
5.k in d:检查k是否在d的key里,返回true/false。
key可以为任何不可变类型,也必须为不可变类型。
4.2.3字典的格式化字符串
用法如下:
转换说明符(%)后面直接加上键,即使键是string,也不用再两旁加引号‘’。后面再跟上%和字典。
只要给出的键能在字典中找到,就可以获得任意数量的转换说明符。
4.2.4字典的方法
1.clear():简单来说,clear就是将字典清空。它和赋值字典变量为空字典有很大不同。
在这个例子中,x很明显是一个字典,y=x,并不是创建另一个与x一模一样的字典并赋值给y,而是将x本身关联的字典同时关联到y,仍然只有一个字典。
无论我是从x还是y这边改变字典,都将影响到其他关联到这个字典的变量。所以当我从y这边del字典中的一个‘a’:1,从x这边读取字典,‘a’:1也消失了。
但是如果我运行x={}的话,是创建了一个新的空字典,并将它关联到x,而y仍然与原字典关联,所以原字典并没受到影响。
如果要清空原字典的话,就应该用clear。
2.=,copy()和deppcopy(需要import copy模块):
=:有a,b两个字典,b=a是将a字典的地址直接关联到b,实质上只有一个字典,a,b的任何操作都是在同一个字典上执行。(下面的id(a)和id(b)相当于变量指向的地址,地址相同说明他们代表同一样东西)
copy():浅复制。当运行b=a.copy()时,将创建一个新的字典,但是新字典里的key-value pair里的值并非是创建一模一样的值,而是指向原字典的值。当字典中的值改变时,如果地址不变(如append),则两个字典都能观察到改变,如果地址变了(如赋值),由于在原地址的值仍然是与保持原样的字典关联,所以保持原样的字典是不会受到影响的。
deepcopy:深复制。很容易理解,相当于创建并复制一个一模一样的字典,除了内容相同之外,两个字典的没有任何关系,任何的改变都不会对另一个字典有任何影响。相对于浅复制,深复制由于需要将所有东西复制,所以消耗的内存会更多。
3.fromkeys():使用给定的key建立字典,每个键的默认值为None(可修改)。
4.get():和dict[key]来access字典中元素功能一样,不过如果不存在的话get()会返回None,而dict[key]会报错(之前提到了)。很多时候,我们并不能确定key是否一定存在字典中,get()可以让程序继续运行下去。
5.has_key(key):检查key是否在字典中,python3.x中改成了key in dict。
6.items():将字典以列表的形式返回。(无特殊顺序)
7.keys():将字典中的键以列表形式返回。
8.pop(key):将键为key的key-value pair从字典中移除。若key不存在则报错。
9.popitem():移除任意一个key-value pair。
10.setdefault(key[, default]):如果key在字典里,就返回key对应的值,和get()类似,这种情况下,default就没有任何用处。如果不在,则添加(key:default)到字典里。
11.update(dict):如果dict中包含原来dict有的项(key相同),那么会重写,否则直接添加。
12.values():返回所有的key-value pair中的value。itervalues已经在python3.x中取消。