8. Mapping Types — dict
甲映射對象映射可(kě)哈希值到任意對象。映射是可(kě)變對象。目前隻有一(yī)種标準映射類型,即字典。(對于其它容器看(kàn)到內(nèi)置在list,set和(hé)tuple類和(hé)collections模塊)。
字典的鍵幾乎是任意值。不可(kě)散列的值,即包含列表,字典或其他(tā)可(kě)變類型(通(tōng)過值而不是對象标識進行(xíng)比較)的值不能(néng)用作(zuò)關鍵字。用于鍵的數(shù)字類型服從(cóng)數(shù)字比較的正常規則:如(rú)果兩個數(shù)字比較相等(如(rú)1和(hé)1.0),則它們可(kě)以互換使用以索引相同的字典條目。(但(dàn)請(qǐng)注意,由于計算機将浮點數(shù)字存儲為(wèi)近似值,因此将它們用作(zuò)字典鍵通(tōng)常是不明(míng)智的。)
字典可(kě)以通(tōng)過key: value在花括号中放置逗号分隔的列表來創建,例如(rú):{'jack': 4098, 'sjoerd': 4127}或者{4098: 'jack', 4127: 'sjoerd'},或者通(tōng)過dict構造函數(shù)。
class dict(**kwarg)class dict(mapping, **kwarg)class dict(iterable, **kwarg)
返回從(cóng)可(kě)選的位置參數(shù)和(hé)可(kě)能(néng)為(wèi)空的關鍵字參數(shù)集合初始化的新字典。
如(rú)果沒有給出位置參數(shù),則創建空字典。如(rú)果給出了(le)位置參數(shù)并且它是一(yī)個映射對象,則将使用與映射對象相同的鍵值對創建一(yī)個字典。否則,位置參數(shù)必須是可(kě)叠代的對象。叠代器中的每個項目本身必須是一(yī)個具有兩個對象的叠代器。每個項目的第一(yī)個對象成為(wèi)新字典中的一(yī)個鍵,第二個對象成為(wèi)相應的值。如(rú)果某個鍵出現多次,則該鍵的最後一(yī)個值将成為(wèi)新詞典中的對應值。
如(rú)果給出關鍵字參數(shù),則将關鍵字參數(shù)及其值添加到從(cóng)位置參數(shù)創建的字典中。如(rú)果添加的鍵已經存在,那(nà)麽來自(zì)關鍵字參數(shù)的值将替換位置參數(shù)中的值。
為(wèi)了(le)說明(míng),下(xià)面的例子都(dōu)返回一(yī)個字典,等于{"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})
>>> a == b == c == d == e
True
複制
如(rú)第一(yī)個示例中提供的關鍵字參數(shù)僅适用于有效Python标識符的鍵。否則,可(kě)以使用任何有效的密鑰。
2.2版本中的新功能(néng)。
在版本2.3中進行(xíng)了(le)更改:支持從(cóng)添加的關鍵字參數(shù)構建字典。
這(zhè)些是詞典支持的操作(zuò)(因此,自(zì)定義映射類型也應該支持):
len(d)
返回字典中的項目數(shù)量d。
d[key]
用鑰匙鍵返回d的項目。引發一(yī)個if 鍵不在地(dì)圖中。KeyError
如(rú)果dict的一(yī)個子類定義了(le)一(yī)個方法__missing__()并且鍵不存在,那(nà)麽該d[key]操作(zuò)将使用該鍵的鍵作(zuò)為(wèi)參數(shù)來調用該方法。d[key]然後該操作(zuò)返回或提出__missing__(key)通(tōng)話所返回或提出的任何內(nèi)容。沒有其他(tā)操作(zuò)或方法調用__missing__()。如(rú)果__missing__()沒有定義,KeyError則提出。__missing__()必須是一(yī)種方法; 它不能(néng)是一(yī)個實例變量:
>>> class Counter(dict):
... def __missing__(self, key):
... return 0
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1
複制
上(shàng)面的例子顯示了(le)部分實現collections.Counter。不同的__missing__方法被使用collections.defaultdict。
2.5版新增功能(néng):識别字典子類的__missing__方法。
d[key] = value
設置d[key]為(wèi)值。
del d[key]
d[key]從(cóng)d中删除。引發一(yī)個KeyErrorif 鍵不在地(dì)圖中。
key in d
返回True如(rú)果d有一(yī)個關鍵的鍵,否則返回False。
2.2版本中的新功能(néng)。
key not in d
相當于not key in d。
2.2版本中的新功能(néng)。
iter(d)
返回字典鍵的叠代器。這(zhè)是一(yī)個捷徑iterkeys()。
clear()
從(cóng)字典中删除所有項目。
copy()
返回字典的淺表副本。
fromkeys(seq[, value])
使用來自(zì)seq的鍵和(hé)值設置為(wèi)值創建一(yī)個新字典。
fromkeys()是一(yī)個返回新字典的類方法。值默認為(wèi)None。
2.3版本的新功能(néng)。
get(key[, default])
如(rú)果鍵在字典中,則返回鍵的值,否則返回默認值。如(rú)果默認沒有給出,則默認為(wèi),所以,這(zhè)種方法從(cóng)未提出了(le)一(yī)個。NoneKeyError
has_key(key)
測試字典中是否存在密鑰。has_key()棄用贊成key in d。
items()
返回字典(key, value)對的列表副本。
CPython實現細節:鍵和(hé)值以非随機的任意順序列出,因Python實現而異,取決于字典的插入和(hé)删除曆史。
如(rú)果items(),keys(),values(),iteritems(),iterkeys(),和(hé)itervalues()被稱為(wèi)中間(jiān)沒有修改的字典,列表會直接對應。這(zhè)允許使用以下(xià)內(nèi)容創建(value, key)對zip():pairs = zip(d.values(), d.keys())。對于iterkeys()和(hé)itervalues()方法,同樣的關系也适用:pairs = zip(d.itervalues(), d.iterkeys())提供相同的值pairs。另一(yī)種創建相同列表的方法是pairs = [(v, k) for (k, v) in d.iteritems()]。
iteritems()
返回字典(key, value)對的叠代器。請(qǐng)參閱說明(míng)dict.items()。
使用iteritems()而添加或删除字典條目可(kě)能(néng)會産生一(yī)種RuntimeError或無法遍曆所有條目。
2.2版本中的新功能(néng)。
iterkeys()
在字典的鍵上(shàng)返回一(yī)個叠代器。請(qǐng)參閱說明(míng)dict.items()。
使用iterkeys()而添加或删除字典條目可(kě)能(néng)會産生一(yī)種RuntimeError或無法遍曆所有條目。
2.2版本中的新功能(néng)。
itervalues()
返回字典值的叠代器。請(qǐng)參閱說明(míng)dict.items()。
使用itervalues()而添加或删除字典條目可(kě)能(néng)會産生一(yī)種RuntimeError或無法遍曆所有條目。
2.2版本中的新功能(néng)。
keys()
返回字典的密鑰列表副本。請(qǐng)參閱說明(míng)dict.items()。
pop(key[, default])
如(rú)果鍵在字典中,請(qǐng)将其删除并返回其值,否則返回默認值。如(rú)果未給出缺省值并且鍵不在字典中,KeyError則會引發。
2.3版本的新功能(néng)。
popitem()
(key, value)從(cóng)字典中删除并返回任意一(yī)對。
popitem()對于在字典中進行(xíng)破壞性叠代很(hěn)有用,正如(rú)集合算法中經常使用的那(nà)樣。如(rú)果字典是空的,調用popitem()引發aKeyError。
setdefault(key[, default])
如(rú)果密鑰在字典中,則返回其值。如(rú)果沒有,則插入具有默認值的鍵并返回默認值。默認默認為(wèi)。None
update([other])
更新與來自(zì)鍵/值對字典等,覆蓋現有的密鑰。返回None。
update()接受另一(yī)個字典對象或者鍵/值對的叠代(作(zuò)為(wèi)元組或其他(tā)長(cháng)度為(wèi)2的叠代)。如(rú)果指定了(le)關鍵字參數(shù),則字典随後會使用這(zhè)些鍵/值對進行(xíng)更新:d.update(red=1, blue=2)。
在版本2.4中更改:允許參數(shù)是鍵/值對的叠代并允許關鍵字參數(shù)。
values()
返回字典的值列表的副本。請(qǐng)參閱說明(míng)dict.items()。
viewitems()
返回字典項目((key, value)對)的新視(shì)圖。請(qǐng)參閱下(xià)面的視(shì)圖對象的文檔。
2.7版本的新功能(néng)。
viewkeys()
返回字典密鑰的新視(shì)圖。請(qǐng)參閱下(xià)面的視(shì)圖對象的文檔。
2.7版本的新功能(néng)。
viewvalues()
返回字典值的新視(shì)圖。請(qǐng)參閱下(xià)面的視(shì)圖對象的文檔。
2.7版本的新功能(néng)。
當且僅當它們具有相同的(key, value)對時(shí),字典比較相等。
8.1. Dictionary view objects
返回的對象的dict.viewkeys(),dict.viewvalues()并且dict.viewitems()是視(shì)圖對象。它們提供了(le)有關字典條目的動态視(shì)圖,這(zhè)意味着當字典更改時(shí),視(shì)圖反映了(le)這(zhè)些更改。
字典視(shì)圖可(kě)以叠代以産生它們各自(zì)的數(shù)據,并支持成員(yuán)資格測試:
len(dictview)
返回字典中的條目數(shù)量。
iter(dictview)
返回(key, value)字典中的鍵,值或項目(表示為(wèi)元組)的叠代器。
鍵和(hé)值以非随機的任意順序叠代,在Python實現中有所不同,并取決于字典的插入和(hé)删除曆史。如(rú)果按鍵,值和(hé)項目視(shì)圖被重複執行(xíng)而不對詞典進行(xíng)中間(jiān)修改,則項目順序将直接對應。這(zhè)允許使用以下(xià)內(nèi)容創建(value, key)對zip():pairs = zip(d.values(), d.keys())。另一(yī)種創建相同列表的方法是pairs = [(v, k) for (k, v) in d.items()]。
在添加或删除字典中的條目時(shí)叠代視(shì)圖可(kě)能(néng)會引起RuntimeError或無法叠代所有條目。
x in dictview
返回True如(rú)果X是在底層的字典的鍵,值或項(在後一(yī)種情況下(xià),X應是一(yī)個(key, value)元組)。
按鍵視(shì)圖像集合一(yī)樣,因為(wèi)它們的條目是獨特且可(kě)散列的。如(rú)果所有值都(dōu)是可(kě)散列的,那(nà)麽(鍵,值)對是唯一(yī)且可(kě)散列的,那(nà)麽項目視(shì)圖也是類似的。(由于條目通(tōng)常不是唯一(yī)的,因此值視(shì)圖不被視(shì)為(wèi)集合。)然後,這(zhè)些集合操作(zuò)可(kě)用(“其他(tā)”指的是另一(yī)個視(shì)圖或集合):
dictview & other
将dictview和(hé)另一(yī)個對象的交集作(zuò)為(wèi)新集返回。
dictview | other
将dictview和(hé)另一(yī)個對象的聯合作(zuò)為(wèi)新集返回。
dictview - other
返回dictview和(hé)其他(tā)對象(在所有元素之間(jiān)的差dictview不在其他(tā))作(zuò)為(wèi)新的組。
dictview ^ other
返回對稱差(所有元素無論是在dictview或其他(tā)的dictview,另一(yī)個對象作(zuò)為(wèi)一(yī)組新的,但(dàn)不是在兩者)。
字典視(shì)圖用法的示例:
>>> 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'}
網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發