字典:Python中唯一内建的映射类型
-----------创建字典----------
phonebook = {'Alice':'2341','Beth':'9102','Cecil':'3258'}
print phonebook['Alice']
可以用dict函数,通过其他映射(比如其他字典)或者(键,值)这样的序列对建立字典
items = [('name','Gumby'),('age',42)]
d = dict(items)
print d
dict函数也可以通过关键字参数来创建字典
d = dict(name='Gumby',age = 42)
print d
-----------基本字典操作----------
字典的基本行为在很多方面与序列类似:
print len(d) #返回d中项(键-值对)的数量
print d['name']#获取字典d中键为'name'的值
d['name'] = 'Tom'#将值'Tom'关联到键'name'上
del d['name'] #删除键为'name'的项
'name' in d #检查d中是否含有键为'name'的项
字典与序列不同之处
1.键类型:字典中的键就类似于序列中的索引,但是序列的索引必须为整型数据,而字典 #的键可以为任意一种不可变类型,如浮点型、字符串、元组 。
2.自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立 #新的项。而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上。
3.成员资格:表达式 k in d(d为字典)查找的是键,而不是值。表达式v in l(l为列表)则用来查找值 而不是索引。
字典示例——简单数据库
使用人名作为键的字典。每个人用另外一个字典来表示,其键’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: ')
#查找电话号码还是地址?('p':查询电话号码,'a':查询地址)
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':'2341','Beth':'9102','Cecil':'3258'}
print "Cecil's phone number is %(Cecil)s" % phonebook
template = """ <html>
<head><title>%(title)s</title></head>
<body>
<h1>%(title)s</h1>
<p>%(text)s</p>
</body>"""
data = {'title':'My Home Page','text':'Welcome to my home page!'}
print template % data
-----------字典方法----------
1.clear:清除字典中的所有项,无返回值,或者说返回值为None,#如果x与y对应同一个字典,那么
x = {} 只会清空x,而对y不会有任何影响 #x.clear()则会把x,y都清空
d = {}
d['name'] = 'Gumby'
d['age'] = 42
print d
returned_value = d.clear()
print d
print returned_value
2.copy:返回一个具有相同键-值对的新字典(这个方法实现的是浅拷贝)
x = {'username':'admin','machines':['foo','bar','baz']}
y = x.copy()
y['username'] = 'mlh'
y['machines'].remove('bar')
print y
print x
可以看到,当在副本中替换值的时候,原始字典不受影响,但是,如果修改了某个值(原地修改,而不是替换) 原始的字典也会改变,因为同样的值也存储在原字典中,避免该问题的一种方法就是使用深复制:deepcopy函数
from copy import deepcopy
d = {}
d['names'] = ['Alfred','Bertrand']
c = d.copy()
dc = deepcopy(d)
d['names'].append('Clive')
print c
print dc
3.fromkeys:使用给定的键创建新的字典,每个键默认对应的值为None
{}.fromkeys(['name','age'])
dict.fromkeys(['name','age'])
如果不想使用None作为默认值,也可以自己提供默认值
dict.fromkey(['name','age'],'unknown')
4.get:一个更宽松的访问字典项的方法,在试图访问字典中不存在的项是不会报错,会返回None
d = {}
print d.get('name')
还可以让get函数返回自定义的默认值
print d.get('name','N/A')
如果键存在于字典中,那个就会返回键对应的值
d['name'] = 'Eric'
print d.get('name')
字典方法示例——使用get()的简单数据库
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: ')
#查找电话号码还是地址?('p':查询电话号码,'a':查询地址)
request = raw_input('Phone number(p) or address(a)? ')
if request == 'p':key = 'phone'
if request == 'a':key = 'addr'
key = request
person = people.get(name,{})
label = labels.get(key,key)
result = person.get(key,'not available')
print "%s's %s is %s" %(name,label,result)
5.has_key:检测字典中是否含有给出的键 d.has_key(k)相当于表达式k in d,Python 3.0中不包括这个函数
d = {}
print d.has_key('name')
d['name'] = 'Eric'
print d.has_key('name')
6.items和iteritems
items方法将所有的字典项以列表的形式返回,列表的每一项是一个元组,对应于字典中的一个 #键-值对,返回时没有特殊的顺序
d = {'tilte':'Python Web Site','url':'http:\\www.python.org','spam':0}
print d.items()
iteritems方法的作用大致相同,不过它返回一个迭代器对象,但是它更高效
print d.iteritems()
7.keys和iterkeys
keys方法将字典中的键以列表的形式返回
d = {'name':'Alice','age':20}
print d.keys()
iterkeys返回针对键的迭代器
8.pop:用来获得对应于给定键的值,并将这个键-值对从字典中删除
d = {'x':1,'y':2}
print d.pop('x')
print d
9.popitem :随机的从字典中删除一个键-值对,并返回’值’
d = {'tilte':'Python Web Site','url':'http:\\www.python.org','spam':0}
print d.popitem()
print d
10.setdefault:获取给定键相应的值,如果键不存在,则默认返回None,并将该键和None组成“键-值对,添加到字典中
d = {'name':'Tom'}
print d.setfault('name')
print d
print d.setfault('age')
print d
11.update:利用一个字典项更新另外一个字典
d = {'title':'Python Web Site','url':'http:\\www.python.org','changed':'Mar14 22:09:15 MET 2008'}
x = {'title':'Python Language Website'}
d.update(x)
print d
12.values和itervalues
values方法以列表的形式返回字典中的值,itervalues返回值的迭代器
d = {}
d[1] = 1
d[2] = 2
d[3] = 3
d[4] = 1
print d.values()