6.3.2 字典

在一个数据集合中查找信息有很多种方式,前面介绍的序列采用的是通过位置索引来查 找信息的方式。还有一种常用的查找方式是通过数据间的关联来查找信息,例如手机里的通 信录一般都是通过姓名查找对应的电话号码。Python 中的字典类型可用来实现这种通过数 据查找关联数据的功能。

相信读者都用过字典,知道字典是由大量“词条”组成的,每个词条由“单字(词)” 加“释义”组成。字典的用法正是“根据单字(词)查找释义”。Python 提供的字典类型(dict) 与现实中的字典是类似的:Python 字典是由大量的“键值对(key-value pair)”组成的集合, 每一个键值对形如“key:value”,其用法是通过“键”key 来访问相应的“值”value。

字典类型 dict 与集合类型 set 一样属于无序集合体,即字典中的键值对没有特定的排列 顺序,因此不能像序列那样通过位置索引来查找成员数据。

创建字典

字典的字面值是用一对花括号括起的、以逗号分隔的一些键值对,形如:

{k1:v1,k2:v2,...,kn:vn}

其中,键值对的“键”可以是任何不可修改类型的数据,如数值、字符串和元组等;而键值 对的“值”则可以是任何类型的数据。不含任何键值对的字典是空字典,表示为{}。例如:

>>> d = {'Lucy':1234,'Tom':5678,'Mary':1357}
>>> print d
{'Mary': 1357, 'Lucy': 1234, 'Tom': 5678}

注意,字典中键值对的显示次序与定义次序不同,这是因为字典是无序集合,字典的显示次序由字典在内部的存储结构决定。

除了字面值之外,还可以利用类型构造器 dict()来创建字典,创建时需要将字典的键值 对信息作为参数传递给 dict()。参数的形式有两种:一种是关键字参数形式(参见 4.2.4), 一种是序列(列表或元组)形式,例如:

>>> d1 = dict(name="Lucy",age=8,hobby=("bk","gm"))
>>> d1
{'hobby': ('bk', 'gm'), 'age': 8, 'name': 'Lucy'}
>>> d2 = dict([[(5,1),'Worker'],[(6,1),'Child'],[(7,1),'CPC']])
>>> d2
{(5, 1): 'Worker', (6, 1): 'Child', (7, 1): 'CPC'}

对字典的操作

字典的主要用途是查找与特定键相关联的值,具体操作形式如下:

<字典>[<键>]

其返回值就是字典中与给定的键相关联的值。如果指定的键在字典中不存在,则报错(KeyError)。例如:

>>> d1["name"]
'Lucy'
>>> d1["age"] 8
>>> d1["hobby"]
('bk', 'gm')
>>> d1["gender"]
Traceback (most recent call last):
File "&lt;pyshell#22&gt;", line 1, in &lt;module&gt; d1["gender"]
KeyError: 'gender'

前面创建的字典 d2 是以元组为键的,访问时当然要提供一个元组,且元组括号可省略。 例如:

>>> d2[(6,1)]
'Child'
>>> d2[7,1]
'CPC'

字典类型的数据是可以修改的。与某个键相关联的值可以通过赋值语句来修改,形如:

<字典>[<键>] = <新值>

如果指定的键不存在,则相当于向字典中添加新的键值对。例如:

>>> d1["age"] = 9
>>> d1
{'hobby': ('bk', 'gm'), 'age': 9, 'name': 'Lucy'}
>>> d1["gender"] = "F"
>>> d1
{'hobby': ('bk', 'gm'), 'age': 9, 'name': 'Lucy', 'gender': 'F'}

事实上,创建字典的常用方式就是从空字典开始,利用循环语句以某种方式逐个获得键 值对数据,并利用赋值语句加入字典。

del 命令可以用来删除字典条目,形如:

del <字典>[<键>]

Python 将字典实现为对象,表 6.8 给出了字典对象的方法。

方法 含义
<字典>.has_key(<键>) 若<字典>包含<键>,返回 True;否则返回 False
<字典>.keys() 返回所有键构成的列表
<字典>.values() 返回所有值构成的列表
<字典>.items() 返回所有(key,value)元组构成的列表
<字典>.clear() 删除<字典>的所有条目

图 6.8 字典对象的方法

下面的会话过程演示了对象方法的用法:

>>> d1.keys()
['hobby', 'age', 'name', 'gender']
>>> d1.values()
[('bk', 'gm'), 9, 'Lucy', 'F']
>>> d1.items()[0:2]
[('hobby', ('bk', 'gm')), ('age', 9)]
>>> d1.has_key("gender")
True