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)發