Python 對映型別 dict 使用說明

閱讀 10:07·字數 3039·發佈 
Youtube 頻道
訂閱 133

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為疊代器中的元素,yz為運算式,通常會通過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型別的getsetdefault方法,亦可用來取得字典中的值,他們的參數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型別提供了keysvaluesitems方法,以取得關於鍵,值,鍵值組的視圖物件,這些物件可被方便的用於迴圈陳述式。

需要指出的是,在得到了一個視圖物件後,該物件包含的內容可能會發生變化,當字典的鍵值組被改動時。

在下面的程式碼中,字典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 mx 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.01是相等的鍵,因為他們的雜湊值相等。

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