5.5 字典
另一个 Python 内的数据结构就是 字典 (看 映射类型—字典)。在其他语言中有时候能发现字典的身影,“关联存储器” 或者 “关联数组”。不像其他的序列是由一个范围的数字为索引,字典是用 “key (键)“ 来进行索引的,这些 key 可以是任何的不可变类型。字符串和数字总能作为 key。如果元组中只包含了字符串、数字或元组,那么元组也可以用来作为 key。如果一个元组间接或者直接包含了可变对象,那么这个元组就不能作为 key。你不能把列表当做 key 来使用,因为列表可以通过索引赋值、slice 赋值、或者其他 append() 和 extend() 方法进行修改。
把一个字典想成一组 key : value (键值对) 的无序集合最合适不过了,要求 key 必须是独一无二的 (在一个字典内部)。一对花括号可以创建一个空的字典。在花括号内部放入用逗号分隔开的键值对列表,可以把键值对的初始值加入字典。这也是字典输入和输出的方式。
字典的主要功能是存储一个对应某个 key 的一个值,并且可以通过给定的 key 来抽取这个值。你也可以通过 del
操作符来删除一个键值对。如果你用一个已经使用了的 key 来存储一个值的话,这个 key 对应的旧的值就会被替忽略掉。如果用一个不存在的 key 的取值就会报错。
在一个字典上执行 list(d.keys())
会返回一个字典中所使用的所有的 key 的一个列表,这个列表会随机排列 (如果你想要排序,只要用 sorted(d.keys())
代替就可以了)。查看一个 key 是否在字典中,使用 in
关键字。
注释: 调用 d.keys()
会返回一个 字典视图对象 。它支持比如成员测试或者遍历的操作,但是它的内容不是独立于原来的字典之外的,它仅仅是一个视图。
下面是一个字典的小例子:
>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False
构造函数 dict()
通过传入键值对序列来创建字典:
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
除此之外,字典解析可以通过任意的 key 和值的表达式来创建字典:
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
如果 key 是简单的字符串,有时候用关键字参数来指定键值对更加简单:
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}