URLhttps://learnscript.net/zh-hant/python/data-types/mapping-types/
    複製連結移至說明  範例

    Python 對映型別 dict 使用說明

    閱讀 10:04·字數 3022·發佈 
    Youtube 頻道
    訂閱 375

    Python 對映型別

    Python 的對映型別dict使用鍵值組來儲存資料,鍵值組的鍵和值保持了對映關系。作為鍵的物件需要具有__hash____eq__兩種方法,以確保不會存在兩個相等的鍵,這與集合型別對元素的要求類似。

    Python 物件的 __hash__ 和 __eq__ 方法

    物件的__hash__方法,傳回物件對應的雜湊值,在 Python 中,該值應該是一個整數。物件的__eq__方法,用於判斷物件之間是否是相等的關系。

    集合型別

    關於 Python 的集合型別,你可以檢視Python 集合型別 set,frozenset 使用說明一節。

    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 函式,參數,傳回值介紹,以及函式的定義和呼叫一節。

    {"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__ 方法

    物件的__missing__方法,會在__getitem__方法找不到指定值時被呼叫,他的參數可以是字典鍵值組的鍵,或其他用於確定值的內容。如果__missing__方法傳回了某個值,則該值可作為__getitem__方法的傳回值,對於字典來說,這並不意味著會在字典中產生新的鍵值組。

    除了使用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, /)

    在下面的程式碼中,雖然鍵'age'不存在,但get方法並沒有為字典新增新的鍵值組。

    d = {'name': 'Tom'}
    d.get('age', 0)
    0
    d
    {'name': 'Tom'}
    d.setdefault('age', 0)
    0
    d
    {'name': 'Tom', 'age': 0}

    取得 Python 字典的檢視物件

    dict型別提供了keysvaluesitems方法,以取得關於鍵,值,鍵值組的檢視物件,這些物件可被方便的用於迴圈陳述式。

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

    在下面的程式碼中,字典d的鍵檢視物件發生了變化,在字典被新增了新的鍵值組後。

    d = {'name': 'Tom'}
    k = d.keys()
    k
    dict_keys(['name'])
    d['age'] = 10
    k
    dict_keys(['name', 'age'])

    取得 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 字典

    使用運算子|可以聯結字典,該運算子左右兩邊字典的鍵值組,將被用於建立新字典,對於鍵相等的鍵值組,最後出現的一個將被采納。

    {'name': 'Jack'} | dict(name="Tom", age=10)
    {'name': 'Tom', 'age': 10}

    複製 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關鍵字可用於刪除字典的鍵值組,其格式為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')