天天看點

Python程式設計:詳解内置字典(dict)子類及應用(一網打盡)

作者:傳新視界

前言

本主要介紹Python集合子產品中幾個字典類(dict)的内置擴充子類的應用場景和使用示例,還是結合代碼,讓你能“短平快”的來掌握這些跟dict直接關聯的子類——OrderedDict、defaultdict、userDict。閑話少叙,開始正文——記得 點贊 + 關注啊 ^_^

Python程式設計:詳解内置字典(dict)子類及應用(一網打盡)

文章封面

OrderedDict

Python集合子產品中的有序字典(OrderedDict)就像普通字典一樣,但是有一些與排序操作相關的額外功能。OrderedDict會記住鍵插入的順序。現在它們變得不那麼重要了,因為内置的dict類獲得了記住插入順序的能力(這種新行為在Python 3.7中得到了保證,是以OrderedDict現在顯得不是那麼重要了)。建立有序字典的正常格式:

import collections

ordDict = collections.OrderedDict([items]):

或者

from collections import OrderedDict

ordDict = OrderedDict([items]):

這樣就建立并傳回dict子類的執行個體OrderedDict對象,該子類具有專門用于重新排列字典順序的方法。本文就來簡要介紹這些方法。

1)popitem(last=True):

有序字典的popitem()方法傳回并删一個(key,value)對。如果last為True,則以LIFO(後進先出)方式傳回相應的鍵值對;否則以FIFO(先進先出)順序傳回。

2)move_to_end(key, last=True):

将現有鍵移動到有序字典的任意一端。如果last為True(預設值),則将項移到右端;如果last為False,則移到開頭。如果key不存在會引發KeyError。

請看代碼:

Python程式設計:詳解内置字典(dict)子類及應用(一網打盡)

假設我們删除并重新插入相同的鍵到OrderedDict。它将把這個鍵放到末尾,以保持鍵的插入順序。示例如下:

Python程式設計:詳解内置字典(dict)子類及應用(一網打盡)

運作結果如下:

删除前的OrderedDict:

x X

y Y

z Z

插入後的OrderedDict:

y Y

z Z

x X

UserDict

UserDict類用作Python内置字典(dict)對象的包裝器。對這個類的需求已經部分被直接從dict繼承子類的能力所取代;但是,這個類更容易使用,因為底層字典可以作為屬性通路。當你希望使用一些修改過的或新功能建立自己的字典時,可使用UserDict。其使用格式如下:

import collections

userDict = collections.UserDict([initialdata])

或者

from collections import UserDict

userDict = UserDict([initialdata])

此類模拟字典,其執行個體的内容儲存在一個正常字典中,可以通過UserDict執行個體的data屬性通路該字典。如果提供了initialdata,則用此初始化data内容;注意,執行個體本身不會單獨保留對initialdata的引用(非獨占),是允許它用于其他目的。

除了支援映射的方法和操作之外,UserDict執行個體提供以下屬性:

1)data

一個用于存儲UserDict類内容的真正字典。示例如下:

Python程式設計:詳解内置字典(dict)子類及應用(一網打盡)

輸出結果如下:

{'name': 'Kevin Cui', 'age': 24}

假設我們想要定義一個支援加法操作的自定義字典對象(合并兩字典)。當我們添加自定義字典的兩個執行個體時,我們希望得到一個包含兩個字典中所有元素的新字典。請記住,如果你試圖添加到Python中的正常字典,則會得到TypeError。讓我們在UserDict的幫助下實作它:

Python程式設計:詳解内置字典(dict)子類及應用(一網打盡)

運作輸出結果如下:

{'x': 10, 'y': 20}

當然,你還可以自己實作其它相關的自定義操作。

DefaultDict

Python中Dictionary類的一個常見問題是缺少鍵。當試圖通路字典中不存在的鍵時,将會得到一個KeyError異常。是以每當你需要通路字典中的元素時,你就必須處理這種情況。幸運的是,Python提供了DefaultDict類。它用于為不存在的鍵提供一些預設值且不引發KeyError。

DefaultDict是内置dict類的子類。它覆寫一個方法并添加一個可寫執行個體變量。其餘的功能與dict相同。使用格式如下:

import colloections

defaultDict = collections.defaultdict(default_factory=None, /[,…])

上述代碼傳回一個新的類字典對象DefaultDict,它是内置dict類的子類。

第一個參數為default_factory屬性提供初始值,預設為None。所有剩下的參數都被當作傳遞給dict構造函數一樣對待,包括關鍵字參數。需要了解的是若提供該參數,則須是可調用的。

DefaultDict對象除了支援标準的dict操作外,還支援以下方法屬性:

1)__missing__(key):

如果default_factory屬性為None,用鍵作為參數将引發一個KeyError異常。

如果default_factory不是None,則不帶參數調用它,則為給定的鍵提供預設值,該值被插入到鍵的字典中并傳回。

2)default_factory

DefaultDict對象支援default_factory執行個體變量。該屬性由__missing__()方法使用。如果存在,則從構造函數的第一個參數開始初始化;如果不存在,則初始化為None。

Python程式設計:詳解内置字典(dict)子類及應用(一網打盡)

運作程式輸出結果為:

[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

在上述代碼中,我們使用清單類型作為default_factory,更易于将包含鍵值序列對的清單組成字典。當第一次遇到每個鍵時,它還不在映射中,是以使用default_factory函數自動建立一個條目,該函數傳回一個空清單。然後list.append()操作将值連接配接到新清單。當再次遇到鍵時,查找正常進行(傳回該鍵的清單),然後list.append()操作将另一個值添加到清單中。這種技術比使用dict.setdefault()的等效技術要簡單得多。

我們再看一個示例:

Python程式設計:詳解内置字典(dict)子類及應用(一網打盡)

輸出結果如下:

[('a', 2), ('c', 1), ('g', 2), ('h', 1), ('i', 1), ('j', 1), ('n', 2)]

在上面代碼中,我們将default_factory設定為int。這使得defaultdict用于計數(就像其他語言中的bag或multiset)。

當第一次遇到某個字母時,它就在映射中是不存在的,是以default_factory函數調用int()來提供一個預設的0計數。然後遞增操作為每個字母建立計數。

提示:這裡傳遞的int()函數預設傳回的是整數0。若想傳回任意值,可以自定義個一個基于lambda的常量函數。示例代碼如下:

Python程式設計:詳解内置字典(dict)子類及應用(一網打盡)

一言以蔽之:使用DefaultDict的好處就是可以避免KeyError異常,并進行一些可能的特定處理。

本文小結

本文主要介紹了Python字典(dict)類相關的幾個内置子類的應用。這些直接相關的子類分别是OrderedDict、defaultdict、userDict等内置子類。通過示例代碼和關聯描述,讓你更輕松掌握它們的應用和基本規則。

最後,請點個贊,關注一下@傳新視界,轉發出去讓更多朋友get到,謝謝了,下次見!