做(zuò)自(zì)由與創造的先行(xíng)者

Types: 8. Mapping Types — dict

Python開(kāi)發手冊

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)發
下(xià)一(yī)篇:Types: 9. File Objects
上(shàng)一(yī)篇:Types: 7. Set Types — set, frozenset