除了列表,字典就是python中最灵活的数据类型了。
通过键而不是偏移量来读取:字典有时叫关联数组或者散列表
任意对象的无序集合:键提供了字典中项的象征性(而非物理性)位置,不支持序列操作(无序)
可变长,异构,任意嵌套:可在原处增长或缩短
属于可变映射类型:字典是唯一内置的映射类型
对象引用表(散列表): 字典是作为散列表(支持快速检索的数据结构)来实现的。Python采用最优化的散列算法来寻找键,因此搜索是很快速的。
操作 | 解释 |
D = {} | 空字典 |
D = {'spam': 2, 'eggs': 3} | |
D = {'food': {'ham': 1, 'egg': 2}} | 嵌套 |
D = dict.fromkeys(['a', 'b'])(得到{'a': None, 'b': None}) | 其他构造技术 |
D = dict(zip(keyslist, valslist)) | |
D = dict('name='Bob', age=42) | 新方法 |
D['eggs'] | 以键进行索引 |
D['food']['ham'] | |
'eggs' in D | 成员关系 |
D.keys() | 键 |
D.values() | 值 |
D.items() | 项(键,值) |
D.copy() | |
D.get(key, default) | get key对应的value, 否则返回default |
D.update(D2) | 合并 |
D.pop(key) | 删除 |
len(D) | |
D[key]=42 | 新增or修改 |
del D[key] | |
list(D.keys()) | |
D1.keys() &D2.keys() | |
Dictionary views | ?? |
D = {x: x*2 for x in range(10)} | 字典解析 |
Python3.x中d.keys()返回一个迭代器而不是列表,python2.x返回的是列表
字典用法注意事项:
序列运算无效
对新索引赋值会添加项
键不一定总是字符串,任何不可变对象都可以作为键。不包含可变元素的元组可以作为键。只要有合适的协议,类实例对象也可以作为键。
使用字典模拟灵活的列表
列表末尾外的偏移值是非法的
>>> L = []
>>> L[99] = 'spam'
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
L[99] = 'spam'
IndexError: list assignment index out of range
使用字典模拟:
>>> D = {}
>>> D[99]='spam'
>>> D[99]
'spam'
字典接口
Python的DBM接口通过键来获取文件:
import anydbm
file = anydbm.open('filename'
import anydbm
file = anydbm.open('filename') #Link to file
file['key'] = 'data' #Store data by key
data = file['key'] #fetch data by key
如果你把这段代码中的anydbm改成shelve(shelve是通过键来访问的Python持久对象的数据库),那么你也可以用这种方法储存整个python对象
字典解析
>>> list(zip(['a','b','c'],[1,2,3]))
[('a', 1), ('b', 2), ('c', 3)]
>>> D = dict(zip(['a','b','c'],[1,2,3]))
>>> D
{'a': 1, 'b': 2, 'c': 3}
>>> D = {k:v for (k,v) in zip(['a','b','c'],[1,2,3])}
>>> D
{'a': 1, 'b': 2, 'c': 3}
>>> D = dict.fromkeys(['a','b','c'],0)
>>> D
{'a': 0, 'b': 0, 'c': 0}
Learning Python, Fourth Edition, by Mark Lutz.