字典是内建映射类型,没有特殊的顺序,但是都存储在一个特定的键(key)里,键可以是数字、字符串,甚至是元组
1、字典创建:
>>> items = {'Alice': '2341', 'Beth': 9102, 'Cecil': '3258'}
2、相关函数
1、dict函数
通过其他映射(比如字典)或者(键,值)这样的序列对建立字典
通过关键字参数来创建字典>>> items = [('name', 'Gumby'), ('age', 42)] >>> d = dict(items) >>> d {'age': 42, 'name': 'Gumby'}
>>> d = dict(name = 'Gumby', age = 42) >>> d {'age': 42, 'name': 'Gumby'}
2、基本操作
len(d):返回d中项的数量
d[k]:返回关联到键K上的值
d[k] = v:将值v关联到键K上
del d[k]:删除键K的项
k in d:检查d中是否有键为K的项
3、clear函数
清楚字典中的项,操作原字典,无返回序列
>>> d = {} >>> d['name'] = 'Gumby' >>> d['age'] = 42 >>> d {'age': 42, 'name': 'Gumby'} >>> returned_value = d.clear() >>> d {}
4、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']}
深复制:deepcopy函数
>>> from copy import deepcopy >>> d = {} >>> d['name'] = ['Alfred', 'Bertrand'] >>> c = d.copy() >>> dc = deepcopy(d) >>> d['name'].append('Clive') >>> d {'name': ['Alfred', 'Bertrand', 'Clive']} >>> c {'name': ['Alfred', 'Bertrand', 'Clive']} >>> dc {'name': ['Alfred', 'Bertrand']}
浅copy还有个隐藏的知识:
1.在副本字典中修改这些不可变对象(如字符串,数字,元组[只包含不可变对象的元组])是不会影响原始字典
2.在副本字典中修改可变对象,那么原始字典的内容会被影响
原因:不可变对象发生变化时会生成新的引用指向新的值,而可变对象的值发生变化时,不会生成新的引用
5、fromkeys函数
使用给定的键建立新的字典,默认键值为None,也可以自己提供默认值
>>> {}.fromkeys(['name', 'age']) {'age': None, 'name': None} >>> dict.fromkeys(['name', 'age'], '(unknown)') {'age': '(unknown)', 'name': '(unknown)'}
6、get函数
访问字典项的方法,访问不存在的字典项,返回None(一般情况下,访问不存在的字典项时,会出错)
可以选择默认值,在访问值不存在的时候显示>>> d = {'name': 'Lily'} >>> print d.get('name') 'Lily' >>> print d.get('age') None >>> d['age'] Traceback (most recent call last): File "<pyshell#45>", line 1, in <module> d['age'] KeyError: 'age'
>>> d.get('age', 'no age') 'no age'
7、has_key函数
同表达式 k in d,检测字典中是否含有指定项
>>> d = {'name': 'Lily'} >>> d.has_key('name') True >>> d.has_key('age') False
8、items和iteritems
items方法将所有的字典项以列表方式返回,没有特殊的顺序
iteritems返回一个迭代器对象
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0} >>> d.items() [('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')] >>> it = d.iteritems() >>> it <dictionary-itemiterator object at 0x0124C8D0> >>> list(it) [('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
9、keys和iterkeys
keys将字典中的键以列表形式返回
iterkeys返回针对键的迭代器
10、pop函数
获得对应于给定键的值,然后将这个键-值从字典中移除
>>> d = {'value1': 'aa', 'value2': 'bb'} >>> d.pop('value1') 'aa' >>> d {'value2': 'bb'}
11、popitem函数
随即弹出一个项,返回该项,并从字典中移除
12、setdefault函数
基本同get函数,在字典不含有给定键的情况下设定相应的键值,默认为None
>>> d = {} >>> d.setdefault('name', 'N/A') 'N/A' >>> d {'name': 'N/A'}
13、update函数
利用一个字典更新另外一个字典
>>> d = {'vale1': 'aa', 'value2': 'bb'} >>> d {'vale1': 'aa', 'value2': 'bb'} >>> x = {'value3': 'cc'} >>> d.update(x) >>> d {'vale1': 'aa', 'value3': 'cc', 'value2': 'bb'}
14、values和itervalues
values以列表形式返回字典中的值,itervalues返回的则是相应的迭代器(返回的列表中可以包含相同的元素)
3、格式转换
例:html格式(模板)
>>> 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 <html> <head><title>My Home Page</title></head> <body> <h1>My Home Page</h1> <p>Welcome to my home page!</p> </body>