首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Types: 8. Mapping Types — dict

8. Mapping Types — dict

映射对象映射可哈希值到任意对象。映射是可变对象。目前只有一种标准映射类型,即字典。(对于其它容器看到内置在listsettuple类和collections模块)。

字典的键几乎是任意值。不可散列的值,即包含列表,字典或其他可变类型(通过值而不是对象标识进行比较)的值不能用作关键字。用于键的数字类型服从数字比较的正常规则:如果两个数字比较相等(如11.0),则它们可以互换使用以索引相同的字典条目。(但请注意,由于计算机将浮点数字存储为近似值,因此将它们用作字典键通常是不明智的。)

字典可以通过key: value在花括号中放置逗号分隔的列表来创建,例如:{'jack': 4098, 'sjoerd': 4127}或者{4098: 'jack', 4127: 'sjoerd'},或者通过dict构造函数。

class dict(**kwarg)class dict(mapping, **kwarg)class dict(iterable, **kwarg)

返回从可选的位置参数和可能为空的关键字参数集合初始化的新字典。

如果没有给出位置参数,则创建空字典。如果给出了位置参数并且它是一个映射对象,则将使用与映射对象相同的键值对创建一个字典。否则,位置参数必须是可迭代的对象。迭代器中的每个项目本身必须是一个具有两个对象的迭代器。每个项目的第一个对象成为新字典中的一个键,第二个对象成为相应的值。如果某个键出现多次,则该键的最后一个值将成为新词典中的对应值。

如果给出关键字参数,则将关键字参数及其值添加到从位置参数创建的字典中。如果添加的键已经存在,那么来自关键字参数的值将替换位置参数中的值。

为了说明,下面的例子都返回一个字典,等于{"one": 1, "two": 2, "three": 3}

代码语言:javascript
复制
>>> 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})
>>> a == b == c == d == e
True

如第一个示例中提供的关键字参数仅适用于有效Python标识符的键。否则,可以使用任何有效的密钥。

2.2版本中的新功能。

在版本2.3中进行了更改:支持从添加的关键字参数构建字典。

这些是词典支持的操作(因此,自定义映射类型也应该支持):

len(d)

返回字典中的项目数量d

d[key]

用钥匙返回d的项目。引发一个if 不在地图中。KeyError

如果dict的一个子类定义了一个方法__missing__()并且不存在,那么该d[key]操作将使用该键的作为参数来调用该方法。d[key]然后该操作返回或提出__missing__(key)通话所返回或提出的任何内容。没有其他操作或方法调用__missing__()。如果__missing__()没有定义,KeyError则提出。__missing__()必须是一种方法; 它不能是一个实例变量:

代码语言:javascript
复制
>>> class Counter(dict):
...     def __missing__(self, key):
...         return 0
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1

上面的例子显示了部分实现collections.Counter。不同的__missing__方法被使用collections.defaultdict

2.5版新增功能:识别字典子类的__missing__方法。

d[key] = value

设置d[key]

del d[key]

d[key]d中删除。引发一个KeyErrorif 不在地图中。

key in d

返回True如果d有一个关键的,否则返回False

2.2版本中的新功能。

key not in d

相当于not key in d

2.2版本中的新功能。

iter(d)

返回字典键的迭代器。这是一个捷径iterkeys()

clear()

从字典中删除所有项目。

copy()

返回字典的浅表副本。

fromkeys(seq[, value])

使用来自seq的键和值设置为创建一个新字典。

fromkeys()是一个返回新字典的类方法。默认为None

2.3版本的新功能。

get(key[, default])

如果在字典中,则返回的值,否则返回默认值。如果默认没有给出,则默认为,所以,这种方法从未提出了一个。NoneKeyError

has_key(key)

测试字典中是否存在密钥has_key()弃用赞成key in d

items()

返回字典(key, value)对的列表副本。

CPython实现细节:键和值以非随机的任意顺序列出,因Python实现而异,取决于字典的插入和删除历史。

如果items()keys()values()iteritems()iterkeys(),和itervalues()被称为中间没有修改的字典,列表会直接对应。这允许使用以下内容创建(value, key)zip()pairs = zip(d.values(), d.keys())。对于iterkeys()itervalues()方法,同样的关系也适用:pairs = zip(d.itervalues(), d.iterkeys())提供相同的值pairs。另一种创建相同列表的方法是pairs = [(v, k) for (k, v) in d.iteritems()]

iteritems()

返回字典(key, value)对的迭代器。请参阅说明dict.items()

使用iteritems()而添加或删除字典条目可能会产生一种RuntimeError或无法遍历所有条目。

2.2版本中的新功能。

iterkeys()

在字典的键上返回一个迭代器。请参阅说明dict.items()

使用iterkeys()而添加或删除字典条目可能会产生一种RuntimeError或无法遍历所有条目。

2.2版本中的新功能。

itervalues()

返回字典值的迭代器。请参阅说明dict.items()

使用itervalues()而添加或删除字典条目可能会产生一种RuntimeError或无法遍历所有条目。

2.2版本中的新功能。

keys()

返回字典的密钥列表副本。请参阅说明dict.items()

pop(key[, default])

如果在字典中,请将其删除并返回其值,否则返回默认值。如果未给出缺省值并且不在字典中,KeyError则会引发。

2.3版本的新功能。

popitem()

(key, value)从字典中删除并返回任意一对。

popitem()对于在字典中进行破坏性迭代很有用,正如集合算法中经常使用的那样。如果字典是空的,调用popitem()引发aKeyError

setdefault(key[, default])

如果密钥在字典中,则返回其值。如果没有,则插入具有默认值的并返回默认值默认默认为。None

update([other])

更新与来自键/值对字典,覆盖现有的密钥。返回None

update()接受另一个字典对象或者键/值对的迭代(作为元组或其他长度为2的迭代)。如果指定了关键字参数,则字典随后会使用这些键/值对进行更新:d.update(red=1, blue=2)

在版本2.4中更改:允许参数是键/值对的迭代并允许关键字参数。

values()

返回字典的值列表的副本。请参阅说明dict.items()

viewitems()

返回字典项目((key, value)对)的新视图。请参阅下面的视图对象的文档。

2.7版本的新功能。

viewkeys()

返回字典密钥的新视图。请参阅下面的视图对象的文档。

2.7版本的新功能。

viewvalues()

返回字典值的新视图。请参阅下面的视图对象的文档。

2.7版本的新功能。

当且仅当它们具有相同的(key, value)对时,字典比较相等。

8.1. Dictionary view objects

返回的对象的dict.viewkeys()dict.viewvalues()并且dict.viewitems()视图对象。它们提供了有关字典条目的动态视图,这意味着当字典更改时,视图反映了这些更改。

字典视图可以迭代以产生它们各自的数据,并支持成员资格测试:

len(dictview)

返回字典中的条目数量。

iter(dictview)

返回(key, value)字典中的键,值或项目(表示为元组)的迭代器。

键和值以非随机的任意顺序迭代,在Python实现中有所不同,并取决于字典的插入和删除历史。如果按键,值和项目视图被重复执行而不对词典进行中间修改,则项目顺序将直接对应。这允许使用以下内容创建(value, key)zip()pairs = zip(d.values(), d.keys())。另一种创建相同列表的方法是pairs = [(v, k) for (k, v) in d.items()]

在添加或删除字典中的条目时迭代视图可能会引起RuntimeError或无法迭代所有条目。

x in dictview

返回True如果X是在底层的字典的键,值或项(在后一种情况下,X应是一个(key, value)元组)。

按键视图像集合一样,因为它们的条目是独特且可散列的。如果所有值都是可散列的,那么(键,值)对是唯一且可散列的,那么项目视图也是类似的。(由于条目通常不是唯一的,因此值视图不被视为集合。)然后,这些集合操作可用(“其他”指的是另一个视图或集合):

dictview & other

将dictview和另一个对象的交集作为新集返回。

dictview | other

将dictview和另一个对象的联合作为新集返回。

dictview - other

返回dictview和其他对象(在所有元素之间的差dictview不在其他)作为新的组。

dictview ^ other

返回对称差(所有元素无论是在dictview其他的dictview,另一个对象作为一组新的,但不是在两者)。

字典视图用法的示例:

代码语言:javascript
复制
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.viewkeys()
>>> values = dishes.viewvalues()

>>> # iteration
>>> n = 0
>>> for val in values:
...     n += val
>>> print(n)
504

>>> # keys and values are iterated over in the same order
>>> list(keys)
['eggs', 'bacon', 'sausage', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['spam', 'bacon']

>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}

扫码关注腾讯云开发者

领取腾讯云代金券