1.字典的创立和使用
映射是通过名字来引用值的数据结构,字典是python中唯一内建的映射类型。字典有键和对应的值构成键-值对(又叫项),键和值用冒号 (:) 隔开,项之间用逗号 (,) 隔开,整个字典用大括号括起来,空字典则为{}。字典中的值没有特殊的顺序,但是存放在一个特定的键下,键可以是数字、字符串、元组。
>>> phonebook={'wang':'1234','cui':'2345'}
>>>
我们可以用列表建立一个小型的电话号码数据库,如下
>>> name=['wang','cui']
>>> number=['000','111']
>>> number[name.index('cui')]
'111'
>>>
虽然这种办法可行,但是不实用。
1.1 dict 函数
法 1:
用 dict 函数,通过(键,值)对的序列建立字典。
>>> items=[('name','wang'),('number','1234')]
>>> d=dict(items)
>>> d
{'name': 'wang', 'number': '1234'}
>>> d['name']
'wang'
>>> items=[('name','wang'),('number','1234'),('age','25')]
>>> d
{'name': 'wang', 'number': '1234','age':'25'}
>>>
法2:
dict 函数通过关键字参数创建字典,如下
>>> d=dict(name='wang',number='1234')
>>> d
{'number': '1234', 'name': 'wang'}
>>>
1.2 基本的字典操作
字典的基本行为与列表类似:
- len(d) 返回字典中的项的数量;
- d[k] 返回关联到键 k 上的数值;
- d[k] =v 将值 v 关联到键 k 上;
- del d[k] 删除键为 k 的项;
- k in d 检查 d 中是否含有键为 k 的项;
>>> d=dict(name='wang',number='1234')
>>> d
{'number': '1234', 'name': 'wang'}
>>> len(d)
2
>>> d['number']
'1234'
>>> d['age']=25
>>> d
{'age': 25, 'number': '1234', 'name': 'wang'}
>>> del d['age']
>>> d
{'number': '1234', 'name': 'wang'}
>>> 'age' in d
False
>>> 'name' in d
True
>>> 'number' in d
True
>>>
1.2.1 字典和列表的区别
- 键类型:字典的键是唯一的,但是可以为任意不可变类型,例如整型、浮点型、字符串、元组。
- 自动添加:即使键起初在字典中不存在,也可以通过给它赋值,建立新的项。
- 成员资格:字典中的成员资格查找的是键,不是值,列表中的是查找值,而不是索引。
>>> x=[]
>>> x[42]='bar'
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
x[42]='bar'
IndexError: list assignment index out of range
>>> x={}
>>> x['age']='25'
>>> x
{'age': '25'}
>>>
字典示例:
#一个简单的数据库
#字典使用人名作为键。每个人用另一个字典来表示,其键‘phone’和‘addr’分别表示他们的电话号码和地址
people={
'Alice':{
'phone':'2341',
'addr':'foo drive 23'
},
'Beth':{
'phone':'9012',
'addr':'bar street 43'
},
'Cecil':{
'phone':'3158',
'addr':'baz avenue 90'
}
}
#针对电话号码和地址使用的描述性标签,会打印输出的时候用到
labels={
'phone':'phone number',
'addr':'address'
}
name=raw_input('Name:')
#查找电话号码还是地址
request=raw_input('Phone number(p) or address(a)?')
#使用正确的键
if request =='p':key='phone'
if request =='a':key='addr'
#如果名字是字典中的有效键才打印信息
if name in people:print "%s's %s is %s." %\
(name,labels[key],people[name][key]
)
运行结果为:
>>> ================ RESTART================
>>>
Name:Cecil
Phone number(p) or address(a)?p
Cecil's phone number is 3158.
>>> ================= RESTART ===============
>>>
Name:Beth
Phone number(p) or address(a)?a
Beth's address is bar street 43.
>>>
1.3 字典的格式化字符串
在每个转换说明符中的 % 后面,可以加上键(用圆括号括起来),后面再跟上其它说明元素。
>>> phonebook={'wang':'1234','cui':'2345'}
>>> "wang 's number is %(wang)s " % phonebook
"wang 's number is 1234 "
>>> "wang 's number is % (wang)s" % phonebook
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
"wang 's number is % (wang)s" % phonebook
ValueError: unsupported format character '(' (0x28) at index 20
>>> "wang 's number is %('wang')s " % phonebook
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
"wang 's number is %('wang')s " % phonebook
KeyError: "'wang'"
>>>
注意:%(键)s ,中只是用键名,而且 % 后面跟的字符之间没有空格。