我们已经了解到,列表这种数据结构适用于将值组织到一个结构中,并且通过编号对其引用。本章学习一种通过`名字来引用值的数据结构。这种类型的数据结构称为映射。字典是Python中唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都储存在一个特定的键(Key)下。键可以是数字、字符串甚至是元组。
构造字典的目的,不管是现实中的字典还是在Python中的字典,都是为了可以通过轻松查找某个特定的词语(键),从而找到它的定义(值)。
假如有一个人名列表,如果要创建一颗可以储存这些人的电话号码的小型数据库,建立了这些列表后,可以通过如下方式查找Cecil的电话号码:
names = ['Alice','Beth','Cecil','Dee-Dee','Earl']
numbers = ['2341','9102','1234','2345','2354']
print numbers[names.index('Cecil')]
输出:
1234
虽然这样可行,但是并不实用。
phonebook = {'Alice' :'1234' , 'Beth':'2345','Cecil':'3258'}
print phonebook['Alice']
输出:
1234
可以用dict函数,通过其他映射或者对的序列建立字典。
items = [('name','Gumby'),('age',42)]
d = dict(items)
print d['name']
print d
输出:
Gumby
{'age': 42, 'name': 'Gumby'}
字典的基本行为在很多方面与序列类似:
len(d)返回d中的项(键-值对)的数量;
d[k]返回关联到键k上的值;
d[k]=v将值v关联到键k上;
del d[k]删除键为k的项;
k in d检查d中是否有含有键为k的项。
键类型:字典的键不一定是整型数据,键可以是任意的不可变类型,比如浮点型、字符串或者元组。
自动添加:即使键起初在字典中并不存在,也可以为他赋值,这样字典就会建立新的项。而不能将值关联到列表范围之外的索引上。
成员资格:表达式k in d(d为字典)查找的是键,而不是值。
x = {}
x[42] = 'Foobar'
print x
输出:
# _*_coding:utf8_*_
#一个简单的数据库
#字典使用人名作为键。每个人用另一个字典表示、其键‘phone’和‘addr’分别表示他们的电话号码和地址
people = {'Alice':{'phone':'2341','addr' : 'Foo drive 23'},
'Beth':{'phone':'9102','addr':'Bar street 42'},
'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])
输出:
phonebook = {'Alice' :'1234' , 'Beth':'2345','Cecil':'3258'}
print "Cecil's phone number is %(Cecil)s." % phonebook
输出:
Cecil's phone number is 3258.
1、clear
clear方法清除字典中所有选项。这是个原地操作(类似于list.sort),所以无返回值。
d = {}
d['name'] = 'Gumby'
d['age'] = '42'
print d
print d.clear()
输出:
{'age': '42', 'name': 'Gumby'}
None
2、copy
x = {'username':'admin','machines':['foo','bar','baz']}
y = x.copy()
y['username'] = 'mlh'
y['machines'].remove('bar')
print y
print x
输出:
副本中替换值时不影响原始字典,如果修改(原地修改)了某个值,则原始字典受到了影响。
为避免这个问题,使用deep copy
from copy import deepcopy
d = {}
d['names'] = ['Alfred','Bertrand']
c = d.copy()
dc = deepcopy(d)
d['names'].append('Clive')
print c
print dc
输出:
{'names': ['Alfred', 'Bertrand', 'Clive']}
{'names': ['Alfred', 'Bertrand']}
3、fromkeys
fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的值None。
a = {}.fromkeys(['name','age'])
print a
输出:
4、get
get方法是个更宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会出错,而用get就不会:
d = {}
print d.get('name')
输出:
# coding:utf:8
#使用get()的简单数据库
#这里添加代码清单4-1中插入数据库的代码
people = {'Alice':{'phone':'2341','addr' : 'Foo drive 23'},
'Beth':{'phone':'9102','addr':'Bar street 42'},
'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)?')
#使用正确的键:
key = request #如果请求既不是‘p’也不是‘a’
if request == 'p':key = 'phone'
if request == 'a':key = 'addr'
#使用get()提供默认值:
persen = people.get(name,{})
label = labels.get(key,key)
result = persen.get(key,'not avalable')
print "%s's %s is %s." % (name,label,result)
输出:
5、has_key
has_key方法可以检查字典中是否有特定的键。表达式d.has_key(k)相当于k in d。使用哪个方式很大程度上取决于个人的喜好。Python3.0中不包括这个函数。
d = {}
e = {}
e['name'] = 'ESC'
print d.has_key('name')
print e.has_key('name')
输出:
False
True
6、items和iteritems
items方法将字典所有的项以列表方式返回,列表中的每一项都表示为(键,值)对的形式。但是项在返回时并没有遵循特定的次序。
d = {'title':'Python Web Site','url':'http://python.org','spam':0}
print d.items()
输出:
[('url', 'http://python.org'), ('spam', 0), ('title', 'Python Web Site')]
iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表。
d = {'title':'Python Web Site','url':'http://python.org','spam':0}
it = d.iteritems()
print it
print list(it)
输出:
7、keys和iterkeys
keys方法将字典中的键以列表方式返回,而iterkeys则返回针对键的迭代器
8、pop
pop方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除。
d = {'x':1,'y':2}
print d.pop('x')
print d
输出:
9、popitem
popitem方法类似于list.pop,后者会弹出列表的最后一个元需。但不同的是,popitem弹出随机的项,因为字典里没有最后的元素或者有关顺序的的概念。
d = {'x':1,'y':2}
print d.popitem()
print d
输出:
('y', 2)
{'x': 1}
10、setdefault
setdefault方法在某种程度上类似于get的方法,能够获得与给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值。如果不设定相应键值,项本身也没有键值,则返回None。
d = {}
print d.setdefault('name','N/A')
print d
d['name'] = 'Gumby'
print d.setdefault('name','N/A')
print d
输出:
11、update
update方法可以利用一个字典项更新另一个字典。若有相同的键将覆盖。
d = {'title':'Python web site',
'url':'http://www.python.org',
'changed':'Mar 14 22:09:15 MET 2008'
}
x = {'title':'Python Language Website'}
d.update(x)
print d
输出:
{'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:15 MET 2008', 'title': 'Python Language Website'}
12、values和itervalues
values方法以列表的形式返回字典中的值(iertvalues返回值的迭代器)。与返回键的列表不同的是,返回值的列表中可以包含重复的元素。
d = {}
d[1] = 1
d[2] = 2
d[3] = 3
d[4] = 1
print d.values()
输出:
[1,2,3,1]
dict(seq) | 用(键、值)对(或者映射和关键字参数)建立字典 |