7. Python脚本学习笔记七字典
本篇名言:“当你能飞的时候就不要放弃飞,当你能梦的时候就不要放弃梦,当你能爱的时候就不要放弃爱。生命太过短暂,今天放弃了明天就不一定能得到!”
列表、字符串和字典是Python中最重要的3中结构,前面已经记录了列表和字符串,那么再来看下字典的使用吧。
字典是Python中唯一内建的映射类型。字典中的值没有特殊的顺序,但是都存储在一个特定的键里。键可以是数字、字符串甚至是元组。
1. 创建字典
创建字典如下:
每个键和它的值之间用冒号隔开,项之间用逗号,整个字典由一对大括号括起来。
>>>phonebook={'Alice':'2431','Beth':'9102','Cecil':'3258'}
>>> phonebook
{'Beth': '9102', 'Alice': '2431', 'Cecil':'3258'}
2. 字典使用
2.1 字典方法
2.1.1 dict
通过其他映射或者(键,值)建立字典。
>>>items=[('name','Gumby'),('age',43)]
>>>d=dict(items)
>>> d
{'age': 43,'name': 'Gumby'}
Dict函数也可以通过关键字参数来创建字典,这个是dict函数最有用的功能
>>> d=dict(name='Gumby',age=42)
>>> d
{'age': 42, 'name': 'Gumby'}
2.1.2 键类型
键可以为任何不可变类型,是字典最强大地方。如下:
>>> x=[]
>>> x[42]='Foobar'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out ofrange
>>> x={}
>>> x[42]='Foobar'
>>> x
{42: 'Foobar'}
看个示例:
# A simple database
# A dictionary with person names as keys. Each person is representedas
# another dictionary with the keys 'phone' and 'addr' referring totheir phone
# number and address, respectively.
people = {
'Alice': {
'phone': '2341',
'addr': 'Foo drive 23'
},
'Beth': {
'phone': '9102',
'addr': 'Bar street42'
},
'Cecil': {
'phone': '3158',
'addr': 'Baz avenue90'
}
}
# Descriptive labels for the phone number and address. These will beused
# when printing the output.
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = raw_input('Name: ')
# Are we looking for a phone number or an address?
request = raw_input('Phone number (p) or address (a)? ')
# Use the correct key:
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
# Only try to print information if the name is a valid key in
# our dictionary:
if name in people: print "%s's %s is %s." % \
(name, labels[key],people[name][key])
使用人名作为键的字典,每个人用另一个字典来表示。
输出如下:
Name: Beth
Phonenumber (p) or address (a)? p
Beth's phonenumber is 9102.
2.1.3 字典格式化
>>> phonebook={'Alice':'2431','Beth':'9102','Cecil':'3258'}
>>>"Cecil's phone number is %(Cecil)s." % phonebook
"Cecil'sphone number is 3258."
在%字符后面加上键,再更上说明元素即可。
2.1.4 字典方法
l clear
删除字典中所有的项。
>>> d={}
>>> d['name']='Gubmy
>>> d
{'name': 'Gubmy'}
>>> d.clear()
>>> d
{}
l copy
返回一个具有相同键-值对的新字典。
这是潜复制,不是副本。
当在副本中替换值时候,原始字典不受影响,但是如果修改了某个值,原始的字典也会影响。可以使用deepcopy函数来进行深复制。
>>>x={'username':'admin','machines':['foo','bar','baz']}
>>>y=x.copy()
>>>y['username']='mln'
>>>y['machines'].remove('bar')
>>> x
{'username': 'admin','machines': ['foo', 'baz']}
>>> y
{'username':'mln', 'machines': ['foo', 'baz']}
采用deepcopy后如下:
>>> from copy import deepcopy
>>> d={}
>>>d['names']=['Alfrd','Bertrand']
>>> c=d.copy()
>>> dc=deepcopy(d)
>>> d['names'].append('clive')
>>> c
{'names': ['Alfrd', 'Bertrand', 'clive']}
>>> d
{'names': ['Alfrd', 'Bertrand', 'clive']}
>>> dc
{'names': ['Alfrd', 'Bertrand']}
l Fromkeys
使用给定的键建立新的字典。每个键默认对应的值为None.
>>>{}.fromkeys(['name','age'])
{'age': None,'name': None}
也可以提供默认值如下:
>>> {}.fromkeys(['name','age'],'ok')
{'age': 'ok', 'name': 'ok'}
l Get
宽松的访问字典的方法。
>>> d={}
>>> print d['name']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name'
>>> print d.get('name')
None
也可以在得不到任何值的时候定义默认值
>>> print d.get('name','getnothing')
get nothing
看下字典示例2:
# A simple database using get()
# Insert database (people) from Listing 4-1 here.
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = raw_input('Name: ')
# Are we looking for a phone number or an address?
request = raw_input('Phone number (p) or address (a)? ')
# Use the correct key:
key = request # In case the request is neither 'p' nor 'a'
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
# Use get to provide default values:
person = people.get(name, {})
label = labels.get(key, key)
result = person.get(key, 'not available')
print "%s's %s is %s." % (name, label, result)
l Has_key
Has_key方法可以检查字典中是否含有给出的键。相当于kin d.
>>> d={}
>>> d.has_key('name')
False
>>> d['name']='Eric'
>>> d.has_key('name')
True
l Items和iteritems
Items方法将所有的字典以列表方式返回,每一项都来自(键,值),返回没有顺序。
这个可以将字典装换为列表。
>>> d={'a':1,'b':2,'c':3}
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
而iteritems方法返回一个迭代器对象而不是列表
>>> it=d.iteritems()
>>> it
<dictionary-itemiterator object at0x01DDA660>
>>> list(it)
[('a', 1), ('c', 3), ('b', 2)]
l Keys和iterkeys
Keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器。
>>> t=d.keys()
>>> t
['a', 'c', 'b']
>>> t=d.iterkeys()
>>> list(t)
['a', 'c', 'b']
l Pop
获得对应给定键的值,然后将这个建值移除。
>>> d={'x':1,'y':2}
>>> d.pop('x')
1
l Popitem
弹出随机的项。字典是无序的。
l Setdefault
获得与给定键相关联的值类似get,除此之外,还能设置不含有给定键的建值。
>>> d={'name':'test'}
>>> d.get('name')
'test'
>>> d.setdefault('name')
'test'
>>> d.get('name')
'test'
>>> d.get('namee')
>>> d.setdefault('namee','not')
'not'
>>> d
{'namee': 'not', 'name': 'test'}
本来不存在namee键的,但是setdefault后就存在了。
l Update
用一个字典项更新另外一个字典项,相同的键会覆盖,不存在则添加。
>>> d={'a':1,'b':2}
>>> c={'a':100}
>>> d.update(c)
>>> d
{'a': 100, 'b': 2}
>>> e={'c':50}
>>> d.update(e)
>>> d
{'a': 100, 'c': 50, 'b': 2}
l Values和itervalues
Values返回字典中的值,itervalues返回值的迭代器。
>>> d={'1':1,'2':2,'3':3,'4':4}
>>> d.values()
[1, 3, 2, 4]
>>> t=d.itervalues()
>>> t
<dictionary-valueiterator object at0x01DE3360>
>>> list(t)
[1, 3, 2, 4]