Python 對映型別 dict 使用說明
Python 對映型別
Python 的對映型別dict
使用鍵值組來儲存資料,鍵值組的鍵和值保持了對映關系。作為鍵的物件需要具有__hash__
和__eq__
兩種方法,以確保不會存在兩個相等的鍵,這與 Python 集合型別對元素的要求類似。
Python 物件的 __hash__ 和 __eq__ 方法
物件的__hash__
方法,傳回物件對應的雜湊值,在 Python 中,該值應該是一個整數。物件的__eq__
方法,用於判斷物件之間是否是相等的關系。
集合型別
關於 Python 的集合型別,你可以檢視Python 集合型別 set,frozenset 使用說明一節。
Python dict 型別
Python 的字典dict
,可通過{}
建立,{}
中是字典的鍵值組,鍵值組之間使用,
分隔,鍵值組的鍵與值之間使用:
分隔。
你可以像在集合中一樣使用綜合運算來顯現略微複雜的設計,其格式為z: y for x in iterable
,其中,iterable
為疊代器物件,x
為疊代器中的元素,y
,z
為運算式,通常會通過x
產生值和鍵。
dict
型別的fromkeys
方法,可通過給出的疊代器物件來建立新的字典,字典中的所有鍵值組都具有相同的值。此外,dict
型別的建構子也是建立字典物件的途徑之一。
dict.fromkeys(iterable, value=None, /)
- iterable 參數
iterable
參數是一個包含鍵的疊代器物件。- value 參數
value
參數為鍵值組的值,預設為None
。
dict(*args, **kwargs)
- args 參數
雖然可變參數
args
包含了所有未定義的位置參數,但事實上dict
接受的位置參數只有一個。如果位置參數是對映物件,則將建立一個與該對映物件鍵值組相同的字典,這類似於陰影複製,對映物件和被建立的字典中的值,可能保持對同一執行個體的參考。如果位置參數不是對映物件,那麽他需要是一個疊代器物件,疊代器中的元素應該包含兩個子元素,以分別表示鍵值組的鍵和值。
- kwargs 參數
可變參數
kwargs
包含了所有未定義的關鍵字參數,這些關鍵字參數的參數名和值會組成字典的鍵值組。
建立 Python 字典時重複出現的鍵
在建立字典時,如果同一個鍵重複出現,那麽該鍵最後一次出現的值才是有效的。比如在建構子中,關鍵字參數指定的值會覆蓋位置參數指定的值。
函式
要想深入了解 Python 函式中的各種參數,你可以檢視Python 函式,參數,傳回值介紹,以及 Python 函式的定義和呼叫一節。
{"name": "Jack", 'age': 123}
{'name': 'Jack', 'age': 123}
{f'key_{x}': x for x in range(1, 3)}
{'key_1': 1, 'key_2': 2}
dict.fromkeys((1, 2), '')
{1: '', 2: ''}
dict([['name', 'Jack']], age=10)
{'name': 'Jack', 'age': 10}
存取 Python 字典中的值
要讀取或寫入字典中的值,你需要給出對應的鍵,其書寫方式為d[key]
或d[key]=value
,其中d
為字典物件,key
為鍵,value
為值。
對於d[key]
,如果給出的鍵key
在字典中不存在,且字典物件擁有__missing__
方法,則__missing__
會被呼叫,以傳回合適的值或引發某種例外狀況,如果__missing__
方法不存在,那麽預設引發例外狀況KeyError
。
Python 物件的 __missing__ 方法
Python 物件的__missing__
方法,會在__getitem__
方法找不到指定值時被呼叫,他的參數可以是字典鍵值組的鍵,或其他用於確定值的內容。如果__missing__
方法傳回了某個值,則該值可作為__getitem__
方法的傳回值,對於 Python 字典來說,這並不意味著會在字典中產生新的鍵值組。
除了使用d[key]
,dict
型別的get
和setdefault
方法,亦可用來取得字典中的值,他們的參數key
表示鍵值組的鍵,default
為鍵值組的預設值。
get
方法可以取得鍵key
對應的值,如果字典中不存在鍵key
,則傳回參數default
表示的預設值,若未指定default
,則此時傳回None
。需要說明的是,get
方法並不會向字典新增新的鍵值組,即便給出了default
參數。
與get
方法類似,setdefault
方法同樣可以取得鍵key
對應的值,並指定鍵不存在時的預設值。不同是該方法會在key
不存在時,為字典新增新的鍵值組,key
將作為鍵值組的鍵,default
將作為鍵值組的值,如果未指定default
,則鍵值組的值為None
。
get(key, default=None, /)
setdefault(key, default=None, /)
在下面的 Python 程式碼中,雖然鍵'age'
不存在,但get
方法並沒有為字典新增新的鍵值組。
d = {'name': 'Tom'}
d.get('age', 0)
0
d
{'name': 'Tom'}
d.setdefault('age', 0)
0
d
{'name': 'Tom', 'age': 0}
取得 Python 字典的視圖物件
Python 的dict
型別提供了keys
,values
,items
方法,以取得關於鍵,值,鍵值組的視圖物件,這些物件可被方便的用於迴圈陳述式。
需要指出的是,在得到了一個視圖物件後,該物件包含的內容可能會發生變化,當字典的鍵值組被改動時。
在下面的程式碼中,字典d
的鍵視圖物件發生了變化,在字典被新增了新的鍵值組後。
d = {'name': 'Tom'}
k = d.keys()
k
dict_keys(['name'])
d['age'] = 10
k
dict_keys(['name', 'age'])
取得 Python 字典中鍵值組的個數
Python 中的函式len
,可用於取得字典的鍵值組個數,比如,len({'name': 'Jack', 'age': 10})
的運算結果為2
。
判斷 Python 字典中是否存在某個鍵
使用x in m
或x not in m
,可以判斷字典中是否存在或不存在某個鍵,x
表示鍵,m
表示字典。
'age' not in {'name': 'Jack', 'age': 10}
False
聯結 Python 字典
使用運算子|
可以聯結 Python 字典,該運算子左右兩邊字典的鍵值組,將被用於建立新字典,對於鍵相等的鍵值組,最後出現的一個將被采納。
{'name': 'Jack'} | dict(name="Tom", age=10)
{'name': 'Tom', 'age': 10}
複製 Python 字典
使用 Python 字典的copy
方法,可以對字典進行陰影複製,複製的字典與被複製的字典將互不影響,但兩個字典中的值可能是同一個物件。
在下面的程式碼中,字典b
新增的鍵值組並未影響字典a
,但兩個字典'items'
對應的值,指向了同一個串列。
a = {'items': []}
b = a.copy()
a.get('items').append(123)
b['count'] = 100
a
{'items': [123]}
b
{'items': [123], 'count': 100}
更新 Python 字典
使用dict
型別的update
方法,你可以對字典的多個鍵值組進行更新,如果需要更新的鍵值組不存在,則他將被建立,如果鍵相等的鍵值組被更新了多次,那麽最後一次更新才是有效的。
此外,使用運算子|=
可以產生與update
方法相同的效果,運算子右邊字典的鍵值組,將用於更新左邊的字典。
update([other, /, ]**kwargs)
- other 參數
如果
other
參數是一個字典物件,那麽該字典的鍵值組將被用於更新目標字典。如果other
參數是一個疊代器物件,那麽疊代器中的元素需要包含兩個子元素,以對應鍵值組的鍵和值。- kwargs 參數
如果指定了關鍵字參數,那麽這些參數的參數名和值,將用於更新字典的鍵值組。
在下面的程式碼中,1.0
與1
是相等的鍵,因為他們的雜湊值相等。
d = {'name': 'Jack'}
d.update({1.0: 'A number!'}, name='Tom')
d
{'name': 'Tom', 1.0: 'A number!'}
d |= {1: 'Number'}
d
{'name': 'Tom', 1.0: 'Number'}
刪除 Python 字典中的鍵值組
del
關鍵字可用於刪除 Python 字典的鍵值組,其格式為del d[key]
,d
為字典物件,key
為需要刪除的鍵值組的鍵。當鍵key
在字典中不存在時,del d[key]
將引發例外狀況KeyError
。
字典的pop
方法可用於刪除指定的鍵值組,被刪除的鍵值組的值將作為傳回值傳回。如果指定鍵值組不存在且未提供預設值,則將引發例外狀況KeyError
。
字典的popitem
方法可用於刪除最後被建立的鍵值組,並將被刪除的鍵值組作為元組傳回,元組的第一個元素為鍵,第二個元素為值。如果字典不存在任何鍵值組,則呼叫popitem
將引發例外狀況KeyError
。
Python 3.7 之前,popitem
方法會刪除任意鍵值組。
字典的clear
方法,將刪除字典中所有的鍵值組。
pop(key[, default], /)
- key 參數
參數
key
為需要刪除的鍵值組的鍵,該鍵值組的值將被傳回。- default 參數
當鍵值組不存在時,將傳回
default
參數表示的預設值。
c = {'name': 'Jack'}
c['age'] = 10
c.popitem()
('age', 10)
c.pop('id', 1000)
1000
del c["name"]
c
{}
操作 Python 字典中的鍵
你可以使用list
型別的建構子建立一個關於鍵的串列,使用iter
方法建立一個關於鍵的疊代器物件,使用reversed
方法建立一個順序反轉的鍵的疊代器物件。
序列型別
想要了解 Python 串列,你可以檢視Python 序列型別 list,tuple,range 使用說明一節。
d = dict((("name", "Jack"),("age", 10)))
list(d)
['name', 'age']
tuple(iter(d))
('name', 'age')
tuple(reversed(d))
('age', 'name')