首頁  >  文章  >  後端開發  >  Python程式設計:詳述內建字典(dict)子類別及應用(一網打盡)

Python程式設計:詳述內建字典(dict)子類別及應用(一網打盡)

WBOY
WBOY轉載
2023-04-12 09:04:101327瀏覽

前言

本主要介紹Python集合模組中幾個字典類別(dict)的內建擴充子類別的應用場景和使用範例,還是結合程式碼,讓你能「短平快」的來掌握這些跟dict直接關聯的子類別-OrderedDict、defaultdict、userDict。

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

import collections
userDict = collections.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等内置子类。通过示例代码和关联描述,让你更轻松掌握它们的应用和基本规则。

以上是Python程式設計:詳述內建字典(dict)子類別及應用(一網打盡)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除