当索引行不通时
字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。
Python字典的一些用途:
- 表示棋盘的状态,其中每个键都是由坐标组成的元组;
- 存储文件修改时间,其中的键为文件名;
- 数字电话/地址簿
>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> phonebook['Cecil']
'3258'
字典由键及其对应的值组成,这种键-值对称为项。
可使用函数dict从其他映射(如其他字典)或键-值对序列创建字典。
>>> items=[('name','Gumby'),('age',42)]
>>> d=dict(items)
>>> d
{'name': 'Gumby', 'age': 42}
还可以使用关键字参数来调用dict函数
>>> d=dict(name='Gumby',age=42)
>>> d
{'name': 'Gumby', 'age': 42}
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=input('Name:')
request=input('Phone number(p) or address(a)?')
if request=='P':key='phone'
if request=='a':key='addr'
if name in people:
print("{}'s {} is {}.".format(name,labels[key],people[name][key]))
方法clear删除所有的字典项。
>>> d={}
>>> d['name']='Gumby'
>>> d['age']=42
>>> d
{'name': 'Gumby', 'age': 42}
>>> returned_value=d.clear()
>>> d
{}
>>>print(returned_value)
None
方法copy返回一个新字典,其包含的键-值对与原来的字典相同
>>> x={'username':'admin','machines':['foo','bar','baz']}
>>> y=x.copy()
>>>
>>> y['username']='mlh'
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}
当替换副本中的值时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化。为了避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值。
>>> from copy import deepcopy
>>> d={}
>>> d['name']=['Alfred','Bertrand']
>>> c=d.copy()
>>> dc=deepcopy(d)
>>> d['name'].append('Clive')
>>> c
{'name': ['Alfred', 'Bertrand', 'Clive']}
>>> dc
{'name': ['Alfred', 'Bertrand']}
方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None。
>>> {}.fromkeys(['name','age'])
{'name': None, 'age': None}
不用先创建一个新字典,在对其调用方法fromkeys来创建另一个字典,可以直接对dict调用方法fromkeys,因为dict是所有字典所属的类型。
>>> dict.fromkeys(['name','age'],'(unknown)')
{'name': '(unknown)', 'age': '(unknown)'}
方法get为访问字典项提供了宽松的环境。当在字典中没有找到就不会报错,只会返回默认值None,或者自己定义返回值。
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=input('Name:')
request=input('Phone number(p) or address(a)?')
key=request
if request=='p':key='phone'
if request=='a':key='addr'
person=people.get(name,{})
label=labels.get(key,key)
result=person.get(key,'not available')
print("{}'s {} is {}.".format(name,label,result))
方法items返回一个包含所有字典项的列表,其中每个元素都为(key,value)的形式。
>>> d={'title':'Python Web Site','url':'http://www.python.org','spam':0}
>>> d.items()
dict_items([('title', 'Python Web Site'), ('url', 'http://www.python.org'), ('sp
am', 0)])
方法keys返回一个字典视图,其中包含指定字典中的键。
方法pop可用于获取与指定键相关联的值,并将该键-值对从字典中删除。
>>> d={'x':1,'y':2}
>>> d.pop('x')
1
>>> d
{'y': 2}
方法popitem类似于list.pop,但list.pop弹出列表中的最后一个元素,而popitem随机地弹出一个字典项,因为字典项的顺序是不确定的。
>>> d={'url':'http://www.python.org','spam':0,'title':'Python Web Site'}
>>> d.popitem()
('title', 'Python Web Site')
>>> d
{'url': 'http://www.python.org', 'spam': 0}
方法setdefault有点像get,但是他除了获取与指定键相关联的值之外,setdefault还在字典不包含指定的键时,在字典中添加指定 的键-值对。
>>> d={}
>>> d.setdefault('name','N/A')
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name']='Gumby'
>>> d.setdefault('name','N/A')
'Gumby'
>>> d
{'name': 'Gumby'}
方法update使用一个字典中的项来更新另一个字典。
>>> d={
... 'title':'Python Web Site',
... 'url':'http://www.python.org',
... 'changed':'Mar 14 22:09:15 MET 2016'
... }
>>> x={'title':'Python Language Website'}
>>> d.update(x)
>>> d
{'title': 'Python Language Website', 'url': 'http://www.python.org', 'changed':
'Mar 14 22:09:15 MET 2016'}
方法values返回一个由字典中的值组成的字典视图。不同于方法keys,方法values返回的视图可能包含重复的值。
>>> d={}
>>> d[1]=1
>>> d[2]=2
>>> d[3]=3
>>> d[4]=1
>>> d.values()
dict_values([1, 2, 3, 1])