字典(Dictionary)是 Python 中的一种数据类型,在其他编程语言中,字典可以被称为关联存储(Associative Storage)或关联数组(Associative Array)。字典与序列类型不同,序列类型使用固定范围的数字作为索引来访问元素,而字典使用键进行索引,键可以是任何不可变类型。
字典的主要用途是通过关键字存储、提取值。用 del 可以删除键值对;用已存在的关键字存储值,与该关键字关联的旧值会被取代。通过不存在的键提取值,则会报错。
一、创建字典
字典可用多种方式来创建:
- 使用花括号内以逗号分隔 键: 值 对的方式: {‘jack’: 4098, ‘sjoerd’: 4127} or {4098: ‘jack’, 4127: ‘sjoerd’}
- 使用字典推导式: {}, {x: x ** 2 for x in range(10)}
- 使用类型构造器: dict(), dict([(‘foo’, 100), (‘bar’, 200)]), dict(foo=100, bar=200)
如果没有给出位置参数,将创建一个空字典。 如果给出一个位置参数并且其属于映射对象,将创建一个具有与映射对象相同键值对的字典。 否则的话,位置参数必须为一个 iterable 对象。 该可迭代对象中的每一项本身必须为一个刚好包含两个元素的可迭代对象。 每一项中的第一个对象将成为新字典的一个键,第二个对象将成为其对应的值。 如果一个键出现一次以上,该键的最后一个值将成为其在新字典中对应的值。
如果给出了关键字参数,则关键字参数及其值会被加入到基于位置参数创建的字典。 如果要加入的键已存在,来自关键字参数的值将替代来自位置参数的值。
以下示例返回的字典均等于 {“one”: 1, “two”: 2, “three”: 3}:
>>>a = dict(one=1, two=2, three=3) >>>b = {'one': 1, 'two': 2, 'three': 3} >>>c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) >>>d = dict([('two', 2), ('one', 1), ('three', 3)]) >>>e = dict({'three': 3, 'one': 1, 'two': 2}) >>>f = dict({'one': 1, 'three': 3}, two=2) >>>a == b == c == d == e == f True
执行 list(d) 操作将返回字典 d 中所有键的列表,按照插入次序排列,返回的列表中的键的顺序与将键添加到字典中的顺序相同。检查字典里是否存在某个键,使用关键字 in。
以下是一些字典的简单示例:
>>>tel = {'jack': 4098, 'sape': 4139} >>>tel['guido'] = 4127 >>>tel {'jack': 4098, 'sape': 4139, 'guido': 4127} >>>tel['jack'] 4098 >>>del tel['sape'] >>>tel['irv'] = 4127 >>>tel {'jack': 4098, 'guido': 4127, 'irv': 4127} >>>list(tel) ['jack', 'guido', 'irv'] >>>sorted(tel) ['guido', 'irv', 'jack'] >>>'guido' in tel True >>>'jack' not in tel False
dict() 构造函数可以直接用键值对序列创建字典:
>>>dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) {'sape': 4139, 'guido': 4127, 'jack': 4098}
字典推导式可以用任意键值表达式创建字典:
>>>{x: x**2 for x in (2, 4, 6)} {2: 4, 4: 16, 6: 36}
关键字是比较简单的字符串时,直接用关键字参数指定键值对更便捷:
>>>dict(sape=4139, guido=4127, jack=4098) {'sape': 4139, 'guido': 4127, 'jack': 4098}
二、字典支持的操作
这些是字典所支持的操作(因而自定义的映射类型也应当支持):
list(d)
- 返回字典 d 中使用的所有键的列表。
len(d)
- 返回字典 d 中的项数。
d[key]
- 返回 d 中以 key 为键的项。 如果映射中不存在 key 则会引发 KeyError。
对于字典的子类,如果定义了 __missing__() 方法,并且在访问一个不存在的键时会调用该方法。在这种情况下,d[key] 操作将调用 __missing__(key) 方法,并将缺失的键作为参数传递给该方法。__missing__(key) 方法可以返回任何对象或引发异常。以下是一个示例,展示了如何定义一个继承自字典的子类 Counter,并在 __missing__() 方法中定义了默认值逻辑:
>>>class Counter(dict): ... def __missing__(self, key): ... return 0 >>>c = Counter() >>>c['red'] 0 >>>c['red'] += 1 >>>c['red'] 1