mapping 对象会将 hashable 值映射到任意对象。 映射属于可变对象。 目前仅有一种标准映射类型 字典。 (关于其他容器对象请参看 list
, set
与 tuple
等内置类,以及 collections
模块。)
字典的键 几乎 可以是任何值。 非 hashable 的值,即包含列表、字典或其他可变类型的值(此类对象基于值而非对象标识进行比较)不可用作键。 数字类型用作键时遵循数字比较的一般规则:如果两个数值相等 (例如 1
和 1.0
) 则两者可以被用来索引同一字典条目。 (但是请注意,由于计算机对于浮点数存储的只是近似值,因此将其用作字典键是不明智的。)字典可以通过将以逗号分隔的 键: 值
对列表包含于花括号之内来创建,例如: {'jack': 4098, 'sjoerd': 4127}
或 {4098: 'jack', 4127: 'sjoerd'}
,也可以通过 dict
构造器来创建。class dict
(**kwargs)class dict
(mapping, **kwargs)class dict
(iterable, **kwargs)
返回一个新的字典,基于可选的位置参数和可能为空的关键字参数集来初始化。
字典可用多种方式来创建:
- 使用花括号内以逗号分隔
键: 值
对的方式: {'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
像第一个例子那样提供关键字参数的方式只能使用有效的 Python 标识符作为键。 其他方式则可使用任何有效的键。
这些是字典所支持的操作(因而自定义的映射类型也应当支持):
list(d)
返回字典 d 中使用的所有键的列表。
len(d)
返回字典 d 中的项数。
d[key]
返回 d 中以 key 为键的项。 如果映射中不存在 key 则会引发 KeyError
。如果字典的子类定义了方法 __missing__()
并且 key 不存在,则 d[key]
操作将调用该方法并附带键 key 作为参数。 d[key]
随后将返回或引发 __missing__(key)
调用所返回或引发的任何对象或异常。 没有其他操作或方法会发起调用 __missing__()
。 如果未定义 __missing__()
,则会引发 KeyError
。 __missing__()
必须是一个方法;
>>> class Counter(dict):
... def __missing__(self, key):
... return 0
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1
>>> d = {'a': 1}
>>> d.values() == d.values()
False
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}
>>> d
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> list(d)
['one', 'two', 'three', 'four']
>>> list(d.values())
[1, 2, 3, 4]
>>> d["one"] = 42
>>> d
{'one': 42, 'two': 2, 'three': 3, 'four': 4}
>>> del d["two"]
>>> d["two"] = None
>>> d
{'one': 42, 'three': 3, 'four': 4, 'two': None}
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}
>>> d
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> list(reversed(d))
['four', 'three', 'two', 'one']
>>> list(reversed(d.values()))
[4, 3, 2, 1]
>>> list(reversed(d.items()))
[('four', 4), ('three', 3), ('two', 2), ('one', 1)]