做自(zì)由與創造的先行者

Types: 8. Mapping Types — dict

Python開(kāi)發手冊

8. Mapping Types — dict

甲映射對(duì)象映射可哈希值到(dào)任意對(duì)象。映射是可變對(duì)象。目前隻有一種标準映射類型,即字典。(對(duì)于其它容器看(kàn)到(dào)内置在list,set和(hé)tuple類和(hé)collections模塊)。

字典的鍵幾乎是任意值。不可散列的值,即包含列表,字典或其他(tā)可變類型(通過值而不是對(duì)象标識進行比較)的值不能(néng)用(yòng)作(zuò)關鍵字。用(yòng)于鍵的數字類型服從(cóng)數字比較的正常規則:如果兩個數字比較相等(如1和(hé)1.0),則它們可以互換使用(yòng)以索引相同的字典條目。(但(dàn)請(qǐng)注意,由于計(jì)算(suàn)機将浮點數字存儲爲近似值,因此将它們用(yòng)作(zuò)字典鍵通常是不明(míng)智的。)

字典可以通過key: value在花(huā)括号中放(fàng)置逗号分隔的列表來(lái)創建,例如:{'jack': 4098, 'sjoerd': 4127}或者{4098: 'jack', 4127: 'sjoerd'},或者通過dict構造函數。

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

返回從(cóng)可選的位置參數和(hé)可能(néng)爲空(kōng)的關鍵字參數集合初始化的新字典。

如果沒有給出位置參數,則創建空(kōng)字典。如果給出了(le)位置參數并且它是一個映射對(duì)象,則将使用(yòng)與映射對(duì)象相同的鍵值對(duì)創建一個字典。否則,位置參數必須是可叠代的對(duì)象。叠代器中的每個項目本身必須是一個具有兩個對(duì)象的叠代器。每個項目的第一個對(duì)象成爲新字典中的一個鍵,第二個對(duì)象成爲相應的值。如果某個鍵出現(xiàn)多次,則該鍵的最後一個值将成爲新詞典中的對(duì)應值。

如果給出關鍵字參數,則将關鍵字參數及其值添加到(dào)從(cóng)位置參數創建的字典中。如果添加的鍵已經存在,那麽來(lái)自(zì)關鍵字參數的值将替換位置參數中的值。

爲了(le)說明(míng),下(xià)面的例子都返回一個字典,等于{"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

複制

如第一個示例中提供的關鍵字參數僅适用(yòng)于有效Python标識符的鍵。否則,可以使用(yòng)任何有效的密鑰。

2.2版本中的新功能(néng)。

在版本2.3中進行了(le)更改:支持從(cóng)添加的關鍵字參數構建字典。

這(zhè)些(xiē)是詞典支持的操作(zuò)(因此,自(zì)定義映射類型也(yě)應該支持):

len(d)

返回字典中的項目數量d。

d[key]

用(yòng)鑰匙鍵返回d的項目。引發一個if 鍵不在地圖中。KeyError

如果dict的一個子類定義了(le)一個方法__missing__()并且鍵不存在,那麽該d[key]操作(zuò)将使用(yòng)該鍵的鍵作(zuò)爲參數來(lái)調用(yòng)該方法。d[key]然後該操作(zuò)返回或提出__missing__(key)通話(huà)所返回或提出的任何内容。沒有其他(tā)操作(zuò)或方法調用(yòng)__missing__()。如果__missing__()沒有定義,KeyError則提出。__missing__()必須是一種方法; 它不能(néng)是一個實例變量:

>>> class Counter(dict):

... def __missing__(self, key):

... return 0

>>> c = Counter()

>>> c['red']

0

>>> c['red'] += 1

>>> c['red']

1

複制

上(shàng)面的例子顯示了(le)部分實現(xiàn)collections.Counter。不同的__missing__方法被使用(yòng)collections.defaultdict。

2.5版新增功能(néng):識别字典子類的__missing__方法。

d[key] = value

設置d[key]爲值。

del d[key]

d[key]從(cóng)d中删除。引發一個KeyErrorif 鍵不在地圖中。

key in d

返回True如果d有一個關鍵的鍵,否則返回False。

2.2版本中的新功能(néng)。

key not in d

相當于not key in d。

2.2版本中的新功能(néng)。

iter(d)

返回字典鍵的叠代器。這(zhè)是一個捷徑iterkeys()。

clear()

從(cóng)字典中删除所有項目。

copy()

返回字典的淺表副本。

fromkeys(seq[, value])

使用(yòng)來(lái)自(zì)seq的鍵和(hé)值設置爲值創建一個新字典。

fromkeys()是一個返回新字典的類方法。值默認爲None。

2.3版本的新功能(néng)。

get(key[, default])

如果鍵在字典中,則返回鍵的值,否則返回默認值。如果默認沒有給出,則默認爲,所以,這(zhè)種方法從(cóng)未提出了(le)一個。NoneKeyError

has_key(key)

測試字典中是否存在密鑰。has_key()棄用(yòng)贊成key in d。

items()

返回字典(key, value)對(duì)的列表副本。

CPython實現(xiàn)細節:鍵和(hé)值以非随機的任意順序列出,因Python實現(xiàn)而異,取決于字典的插入和(hé)删除曆史。

如果items(),keys(),values(),iteritems(),iterkeys(),和(hé)itervalues()被稱爲中間沒有修改的字典,列表會(huì)直接對(duì)應。這(zhè)允許使用(yòng)以下(xià)内容創建(value, key)對(duì)zip():pairs = zip(d.values(), d.keys())。對(duì)于iterkeys()和(hé)itervalues()方法,同樣的關系也(yě)适用(yòng):pairs = zip(d.itervalues(), d.iterkeys())提供相同的值pairs。另一種創建相同列表的方法是pairs = [(v, k) for (k, v) in d.iteritems()]。

iteritems()

返回字典(key, value)對(duì)的叠代器。請(qǐng)參閱說明(míng)dict.items()。

使用(yòng)iteritems()而添加或删除字典條目可能(néng)會(huì)産生一種RuntimeError或無法遍曆所有條目。

2.2版本中的新功能(néng)。

iterkeys()

在字典的鍵上(shàng)返回一個叠代器。請(qǐng)參閱說明(míng)dict.items()。

使用(yòng)iterkeys()而添加或删除字典條目可能(néng)會(huì)産生一種RuntimeError或無法遍曆所有條目。

2.2版本中的新功能(néng)。

itervalues()

返回字典值的叠代器。請(qǐng)參閱說明(míng)dict.items()。

使用(yòng)itervalues()而添加或删除字典條目可能(néng)會(huì)産生一種RuntimeError或無法遍曆所有條目。

2.2版本中的新功能(néng)。

keys()

返回字典的密鑰列表副本。請(qǐng)參閱說明(míng)dict.items()。

pop(key[, default])

如果鍵在字典中,請(qǐng)将其删除并返回其值,否則返回默認值。如果未給出缺省值并且鍵不在字典中,KeyError則會(huì)引發。

2.3版本的新功能(néng)。

popitem()

(key, value)從(cóng)字典中删除并返回任意一對(duì)。

popitem()對(duì)于在字典中進行破壞性叠代很(hěn)有用(yòng),正如集合算(suàn)法中經常使用(yòng)的那樣。如果字典是空(kōng)的,調用(yòng)popitem()引發aKeyError。

setdefault(key[, default])

如果密鑰在字典中,則返回其值。如果沒有,則插入具有默認值的鍵并返回默認值。默認默認爲。None

update([other])

更新與來(lái)自(zì)鍵/值對(duì)字典等,覆蓋現(xiàn)有的密鑰。返回None。

update()接受另一個字典對(duì)象或者鍵/值對(duì)的叠代(作(zuò)爲元組或其他(tā)長度爲2的叠代)。如果指定了(le)關鍵字參數,則字典随後會(huì)使用(yòng)這(zhè)些(xiē)鍵/值對(duì)進行更新:d.update(red=1, blue=2)。

在版本2.4中更改:允許參數是鍵/值對(duì)的叠代并允許關鍵字參數。

values()

返回字典的值列表的副本。請(qǐng)參閱說明(míng)dict.items()。

viewitems()

返回字典項目((key, value)對(duì))的新視(shì)圖。請(qǐng)參閱下(xià)面的視(shì)圖對(duì)象的文(wén)檔。

2.7版本的新功能(néng)。

viewkeys()

返回字典密鑰的新視(shì)圖。請(qǐng)參閱下(xià)面的視(shì)圖對(duì)象的文(wén)檔。

2.7版本的新功能(néng)。

viewvalues()

返回字典值的新視(shì)圖。請(qǐng)參閱下(xià)面的視(shì)圖對(duì)象的文(wén)檔。

2.7版本的新功能(néng)。

當且僅當它們具有相同的(key, value)對(duì)時(shí),字典比較相等。

8.1. Dictionary view objects

返回的對(duì)象的dict.viewkeys(),dict.viewvalues()并且dict.viewitems()是視(shì)圖對(duì)象。它們提供了(le)有關字典條目的動态視(shì)圖,這(zhè)意味着當字典更改時(shí),視(shì)圖反映了(le)這(zhè)些(xiē)更改。

字典視(shì)圖可以叠代以産生它們各自(zì)的數據,并支持成員資格測試:

len(dictview)

返回字典中的條目數量。

iter(dictview)

返回(key, value)字典中的鍵,值或項目(表示爲元組)的叠代器。

鍵和(hé)值以非随機的任意順序叠代,在Python實現(xiàn)中有所不同,并取決于字典的插入和(hé)删除曆史。如果按鍵,值和(hé)項目視(shì)圖被重複執行而不對(duì)詞典進行中間修改,則項目順序将直接對(duì)應。這(zhè)允許使用(yòng)以下(xià)内容創建(value, key)對(duì)zip():pairs = zip(d.values(), d.keys())。另一種創建相同列表的方法是pairs = [(v, k) for (k, v) in d.items()]。

在添加或删除字典中的條目時(shí)叠代視(shì)圖可能(néng)會(huì)引起RuntimeError或無法叠代所有條目。

x in dictview

返回True如果X是在底層的字典的鍵,值或項(在後一種情況下(xià),X應是一個(key, value)元組)。

按鍵視(shì)圖像集合一樣,因爲它們的條目是獨特且可散列的。如果所有值都是可散列的,那麽(鍵,值)對(duì)是唯一且可散列的,那麽項目視(shì)圖也(yě)是類似的。(由于條目通常不是唯一的,因此值視(shì)圖不被視(shì)爲集合。)然後,這(zhè)些(xiē)集合操作(zuò)可用(yòng)(“其他(tā)”指的是另一個視(shì)圖或集合):

dictview & other

将dictview和(hé)另一個對(duì)象的交集作(zuò)爲新集返回。

dictview | other

将dictview和(hé)另一個對(duì)象的聯合作(zuò)爲新集返回。

dictview - other

返回dictview和(hé)其他(tā)對(duì)象(在所有元素之間的差dictview不在其他(tā))作(zuò)爲新的組。

dictview ^ other

返回對(duì)稱差(所有元素無論是在dictview或其他(tā)的dictview,另一個對(duì)象作(zuò)爲一組新的,但(dàn)不是在兩者)。

字典視(shì)圖用(yòng)法的示例:

>>> 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'}

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:Types: 9. File Objects
上(shàng)一篇:Types: 7. Set Types — set, frozenset