天天看點

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

映射類型 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。

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

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())**的簡寫。

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

clear()

從字典中删除所有項目。

copy()

傳回字典的淺拷貝。

classmethod fromkeys(seq [,value ] )

使用seq中的鍵建立一個新字典,并将值設定為value。

fromkeys()是一個傳回新字典的類方法。value 預設為

None

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

get(key[, default])

如果key在字典中,則傳回key的值,否則傳回default。如果未給出default,則預設為

None

,是以此方法永遠不會引發

KeyError

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

items()

傳回字典項目(

(key, value)

對)的新視圖。請參閱視圖對象的文檔。

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

keys()

傳回字典鍵的新視圖。請參閱視圖對象的文檔。

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

pop(key[, default])

如果key在字典中,則将其删除并傳回其值,否則傳回 default。如果未給出default并且key不在字典中,則引發

KeyError

popitem()

從字典中删除并傳回一個

(key, value)

對。對以LIFO(後進先出)順序彈出。

popitem()對于在字典中進行破壞性疊代很有用,就像在集合算法中經常使用的那樣。如果字典為空,則調用 popitem()會引發

KeyError

在版本3.7中更改:現在保證LIFO順序。在先前版本中,popitem()将傳回任意鍵/值對。

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

setdefault(key[, default])

如果key在字典中,則傳回其對應的值。如果不在,插入key ,值為default和傳回default。 default預設為 None。

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

update([other])

更新來自other中的鍵/值對字典,覆寫現有的key。傳回

None

update()接受另一個字典對象或可疊代的鍵/值對(比如元組或長度為2的可疊代對象)。如果指定了關鍵字參數,則使用這些鍵/值對更新字典:

d.update(red=1, blue=2)

Python 3.7.1 資料類型 字典 dict1. 定義2. 類3. 方法4. 字典視圖對象

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