映射類型 dict
- 1. 定義
- 2. 類
- 3. 方法
-
- len(d)
- d[key]
- d[key] = value
- del d[key]
- key in d
- key not in d
- iter(d)
- clear()
- copy()
- classmethod fromkeys(seq [,value ] )
- get(key[, default])
- items()
- keys()
- pop(key[, default])
- popitem()
- setdefault(key[, default])
- update([other])
- values()
- 4. 字典視圖對象
-
- len(dictview)
- iter(dictview)
- x in dictview
1. 定義
一個映射對象映射可哈希值到任意對象。映射是可變對象。目前隻有一種标準的映射類型,即字典。(對于其它容器見内置的 list,set 和tuple類 和 collections子產品)。
字典的鍵幾乎是任意值。不可哈希的值,即包含清單,字典或其他可變類型(通過值而不是通過對象辨別進行比較)的值不能用作鍵。用于鍵的數字類型遵循用于數字比較的正常規則:如果兩個數字比較相等(例如
1
和
1.0
),則它們可以互換地用于索引相同的字典條目。(但請注意,由于計算機将浮點數存儲為近似值,是以将它們用作字典鍵通常是不明智的。)
可以通過 在大括号中放置以逗号分隔的
key: value
對清單來建立字典,例如:
{'jack': 4098, 'sjoerd': 4127}
或
{4098: 'jack', 4127: 'sjoerd'}
,或由dict構造函數。
2. 類
class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)
傳回一個新的字典,從可選的位置參數和可能為空的關鍵字參數集初始化而來。
如果沒有給出位置參數,則建立一個空字典。如果給出位置參數并且它是映射對象,則建立具有與映射對象相同的鍵 - 值對的字典。否則,位置參數必須是可疊代(iterable)對象。iterable中的每個項目本身都必須是具有兩個對象的可疊代項。每個項目的第一個對象成為新詞典中的一個鍵,第二個對象成為相應的值。如果某個鍵出現多次,則該鍵的最後一個值将成為新字典中的相應值。
如果給出了關鍵字參數,則将關鍵字參數及其值添加到從位置參數建立的字典中。如果已添加的鍵已存在,則keyword參數中的值将替換位置參數中的值。
為了說明,以下示例都傳回一個等于
{"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
如第一個示例中所示,提供關鍵字參數僅适用于作為有效Python辨別符的鍵。
3. 方法
這些是字典支援的操作(是以,自定義映射類型也應該支援這些):
len(d)
傳回字典中的項目數d。
d[key]
傳回key對應的值。key不在字典中引發
KeyError
。
如果dict的子類定義了方法
__missing__()
并且鍵 不存在,
d[key]
就會調用該方法。沒有其他操作或方法可以調用
__missing__()
。如果
__missing__()
未定義,則引發
KeyError
。
__missing__()
必須是一種方法; 它不能是執行個體變量:
>>>
>>> class Counter(dict):
... def __missing__(self, key):
... return 0
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1
上面的例子顯示了 collections.Counter 的部分實作 。使用和collections.defaultdict不同的
__missing__
方法。
d[key] = value
設定
d[key]
為值。
del d[key]
從d中删除key和對應的值。key不在字典中引發
KeyError
。
key in d
如果d有key傳回True,否傳回False。
key not in d
相當于。
not key in d
iter(d)
傳回字典鍵上的一個疊代器。這是**iter(d.keys())**的簡寫。
clear()
從字典中删除所有項目。
copy()
傳回字典的淺拷貝。
classmethod fromkeys(seq [,value ] )
使用seq中的鍵建立一個新字典,并将值設定為value。
fromkeys()是一個傳回新字典的類方法。value 預設為
None
。
get(key[, default])
如果key在字典中,則傳回key的值,否則傳回default。如果未給出default,則預設為
None
,是以此方法永遠不會引發
KeyError
。
items()
傳回字典項目(
(key, value)
對)的新視圖。請參閱視圖對象的文檔。
keys()
傳回字典鍵的新視圖。請參閱視圖對象的文檔。
pop(key[, default])
如果key在字典中,則将其删除并傳回其值,否則傳回 default。如果未給出default并且key不在字典中,則引發
KeyError
。
popitem()
從字典中删除并傳回一個
(key, value)
對。對以LIFO(後進先出)順序彈出。
popitem()對于在字典中進行破壞性疊代很有用,就像在集合算法中經常使用的那樣。如果字典為空,則調用 popitem()會引發
KeyError
。
在版本3.7中更改:現在保證LIFO順序。在先前版本中,popitem()将傳回任意鍵/值對。
setdefault(key[, default])
如果key在字典中,則傳回其對應的值。如果不在,插入key ,值為default和傳回default。 default預設為 None。
update([other])
更新來自other中的鍵/值對字典,覆寫現有的key。傳回
None
。
update()接受另一個字典對象或可疊代的鍵/值對(比如元組或長度為2的可疊代對象)。如果指定了關鍵字參數,則使用這些鍵/值對更新字典:
d.update(red=1, blue=2)
。
values()
傳回字典值的新視圖。請參閱視圖對象的 文檔。
當且僅當它們具有相同的
(key, value)
對時,字典才會相等。順序比較(
'<','<=','> =','>'
)引發
TypeError
。
字典保留了插入順序。請注意,更新key不會影響順序。删除後添加的鍵最後插入。
>>>
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}
>>> d
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> list(d)
['one', 'two', 'three', 'four']
>>> list(d.values())
[1, 2, 3, 4]
>>> d["one"] = 42
>>> d
{'one': 42, 'two': 2, 'three': 3, 'four': 4}
>>> del d["two"]
>>> d["two"] = None
>>> d
{'one': 42, 'three': 3, 'four': 4, 'two': None}
版本3.7中已更改:字典順序保證為插入順序。此行為是來自3.6的CPython的實作細節。
也可以看看
types.MappingProxyType 可用于建立dict的隻讀視圖。
4. 字典視圖對象
dict.keys(),dict.values()和 dict.items()傳回的是視圖對象。它們提供字典條目的動态視圖,這意味着當字典更改時,視圖會反映這些更改。
字典視圖可以疊代生成各自的資料,并支援成員測試:
len(dictview)
傳回字典中的條目數。
iter(dictview)
在字典中的鍵,值或項目(表示為
(key, value)
元組)上傳回一個疊代器 。
鍵和值按插入順序可疊代。這允許使用zip()方式建立
(key, value)
對:
pairs = zip(d.values(), d.keys())
建立相同清單的另一種方法是
pairs = [(v, k) for (k, v) in d.items()]
。
在字典中添加或删除條目時疊代視圖可能會引發
RuntimeError
或不能周遊所有條目。
版本3.7中已更改:字典順序保證為插入順序。
x in dictview
如果X是在底層的字典的鍵,值或項(在後一種情況下,X應是一個
(key, value)
元組)傳回True。
key視圖類似set,因為它們的條目是唯一且可哈希的。如果所有值都是可哈希的,那麼
(key, value)
對是唯一且可哈希的,那麼items視圖也類似于set。(因為條目通常不是唯一的是以values視圖不被視為類似set)。對于類似set的視圖,所有在抽象基類collections.abc.Set中定義的操作的是可用的(例如
==,<,^
)。
字典視圖用法的示例:
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # iteration
>>> n = 0
>>> for val in values:
... n += val
>>> print(n)
504
>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']
>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'}
{'juice', 'sausage', 'bacon', 'spam'}