在 Python 中應該如何以及何時使用 Defaultdict?
已發表: 2022-10-06在本教程中,您將學習如何在使用 Python 字典時使用 Python 集合模塊中的defaultdict來更好地處理 KeyErrors。
在 Python 中,字典是一種強大的內置數據結構,它以鍵值對的形式存儲數據。 您將使用鍵來訪問字典並訪問值。
但是,當您的 Python 腳本中有多個字典在代碼執行期間被修改時,您經常會遇到 KeyErrors。 您可以通過幾種不同的方式來處理它們。
在本教程中,您將學習:
- KeyErrors 是什麼以及它們出現的原因
- 如何處理 KeyErrors
- 如何使用 Python 的 defaultdict(繼承自內置 dict 類的子類)更好地處理丟失的鍵
讓我們開始!
Python 中的 KeyError 是什麼?

在定義 Python 字典時,你應該注意你應該確保以下幾點:
- 鍵應該是唯一的——沒有任何重複。
- 當使用現有的可迭代對像作為字典的鍵時,您應該更喜歡使用不可變集合,例如元組。
所以一個鍵只有在字典中存在時才有效; 否則會導致 KeyErrors。
考慮以下字典books_authors
,其中鍵是書名,值是作者姓名。
您可以在 Python REPL 中與本教程一起編寫代碼。
books_authors = { 'Deep Work':'Cal Newport', 'Hyperfocus':'Chris Bailey', 'Pivot':'Jenny Blake', 'The Happiness Equation':'Neil Pasricha' }
您可以使用密鑰(書名)訪問作者姓名。
books_authors['Hyperfocus'] 'Chris Bailey'
要訪問字典中的所有鍵值對,可以調用字典對象的items()
方法,如下所示:
for book,author in books_authors.items(): print(f"'{book}' by {author}")
'Deep Work' by Cal Newport 'Hyperfocus' by Chris Bailey 'Pivot' by Jenny Blake 'The Happiness Equation' by Neil Pasricha
如果您嘗試訪問字典中不存在的鍵的值,Python 解釋器會引發 KeyError。 當我們嘗試訪問不存在的鍵的值時,我們會遇到 KeyError,即“Grit”和“不存在的鍵”。
books_authors['Grit']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-e1a4486f5ced> in <module> ----> 1 books_authors['Grit'] KeyError: 'Grit'
books_authors['non-existent-key']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-a3efd56f69e5> in <module> ----> 1 books_authors['non-existent-key'] KeyError: 'non-existent-key'
那麼如何在 Python 中處理 KeyErrors 呢?
有幾種方法可以做到這一點,我們將在下一節中學習它們。
如何在 Python 中處理 KeyErrors

讓我們學習如何使用以下方法處理 KeyErrors:
- if-else 條件語句
- Try-except 塊
- 字典方法
.get()
#1。 使用 If-Else 條件語句
在 Python 中處理 KeyErrors 的最簡單方法之一是使用 if-else 條件語句。
在 Python 中,if-else 語句具有以下通用語法:
if condition: # do this else: # do something else
- 如果條件為
True
,則執行if
主體中的語句,並且 - 如果條件為
False
,則執行else
主體中的語句。
在此示例中,條件是檢查該鍵是否存在於字典中。
如果鍵存在於字典中,則in
運算符將返回True
,並且 if body 將被執行打印出相應的值。
key = 'The Happiness Equation' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Neil Pasricha
如果字典中不存在該鍵,則in
運算符返回False
並執行else
正文。 它打印出密鑰不存在的消息。
key = 'non-existent-key' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Sorry, this key does not exist!
#2。 使用 Try-Except 語句

另一種處理 KeyError 的常用方法是使用 Python 中的 try-except 語句。
通讀以下代碼塊:
key = 'non-existent-key' try: print(books_authors[key]) except KeyError: print('Sorry, this key does not exist!')
- try塊嘗試檢索與提供的鍵對應的值。
- 如果鍵不存在,解釋器會引發一個 KeyError,它在except塊中作為異常處理。
#3。 使用 .get() 方法
在 Python 中,您可以使用內置的字典方法 .get() 來處理丟失的鍵。
使用
get()
方法的一般語法是dict.get(key,default_value)
其中dict
是 Python 中的有效字典對象。– 如果鍵存在於字典中,則
get()
方法返回值。
– 否則,返回默認值。
在這個例子中, keys
是一個我們想要訪問其值的鍵的列表。 我們遍歷鍵列表以從books_authors
字典中檢索相應的值。
在這裡,我們使用了 .get() 方法,並將“不存在”作為默認值。
keys = ['Grit','Hyperfocus','Make Time','Deep Work'] for key in keys: print(books_authors.get(key,'Does not exist'))
在上面的代碼中:

- 對於
books_authors
字典中存在的鍵,.get()
方法返回相應的值。 - 當鍵不存在時,在本例中為“Grit”和“Make Time”,.get() 方法返回默認值“不存在”。
# Output Does not exist Chris Bailey Does not exist Cal Newport
以上所有方法都有助於我們處理關鍵錯誤。 但是,它們很冗長,需要我們顯式處理丟失的鍵。 您可以通過使用defaultdict而不是常規字典來簡化此過程。
Python中的默認字典

defaultdict 是字典 ( dict
) 類的子類。 所以它繼承了 Python 字典的行為。 此外,它還原生處理丟失的鍵。
defaultdict是一種容器數據類型,內置於 Python 標準庫中——在collections
模塊中。
所以你必須將它導入你的工作環境:
from collections import defaultdict
這是使用defaultdict
的一般語法:
defaultdict(default_factory)
您可以將 int、float 或 list 等可調用對象指定為default_factory
屬性。 如果您沒有為default_factory
提供值,則默認為None
。
當您要查找的鍵不存在時,會觸發__missing__()
方法,並從default_factory
推斷默認值。 然後它返回這個默認值。
總之:
- 在 Python 中,當鍵不存在時,
defaultdict
返回默認值。 - 它還將這個鍵-默認值對添加到字典中,然後您可以對其進行修改。
Python 默認字典示例

接下來,我們將編寫幾個示例來了解 Python defaultdict 的工作原理。
Python中具有默認整數值的Defaultdict
首先,從collections
模塊導入defaultdict
。
from collections import defaultdict import random
讓我們創建一個 defaultdict prices
。
prices = defaultdict(int)
我們現在使用fruits
列表中的項目作為鍵來填充prices
字典。 我們從price_list
中隨機採樣值以獲取值。
price_list = [10,23,12,19,5] fruits = ['apple','strawberry','pomegranate','blueberry'] for fruit in fruits: prices[fruit] = random.choice(price_list)
讓我們看一下prices
中的鍵值對。
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])
像普通的 Python 字典一樣,您可以使用鍵訪問prices
defaultdict 的值:
prices['apple'] # 23
現在,讓我們嘗試訪問不存在的水果的價格,例如“橙子”。 我們看到它返回默認值零。
prices['orange'] # 0
如果我們打印出字典,我們會看到添加了一個新鍵“orange”,默認整數值為零。
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])
Python中的Defaultdict,以List為默認值
讓我們將students_majors
定義為列表的defaultdict
。 專業的名字是關鍵。 這些值是攻讀每個專業的學生名單,例如數學、經濟學、計算機科學等。
from collections import defaultdict students_majors = defaultdict(list)
如果我們嘗試訪問 'Economics' 對應的學生列表,defaultdict 返回一個空列表; 沒有關鍵錯誤!
students_majors['Economics'] # []
我們現在有一個映射到“經濟學”專業的空列表。 所以我們現在可以使用列表方法.append()
將元素添加到這個列表中。
students_majors['Economics'].append('Alex')
在students_majors
默認字典中為“經濟學”創建了一個條目。
print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex']})
您可以將更多學生添加到映射到經濟學專業的列表中,添加新專業等等!
students_majors['Economics'].append('Bob') students_majors['Math'].append('Laura') print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex', 'Bob'], 'Math': ['Laura']})
結論
我希望本教程能幫助您了解如何以及何時在 Python 中使用defaultdict 。 運行本教程中的代碼示例後,您可以在需要時嘗試使用 defaultdict 作為項目中的首選數據結構。
這是您在本教程中學到的內容的摘要。
- 使用 Python 字典時,您經常會遇到 KeyErrors。
- 要處理此類 KeyErrors,您可以使用一些詳細的方法。 您可以使用條件語句、try-except 塊或 .get() 方法。 但是 collections 模塊中的 defaultdict 數據類型可以簡化這個 KeyError 處理。
- 您可以使用defaultdict(default_factory)其中default_factory是有效的可調用對象。
- 當 key 在 defaultdict 中不存在時,默認值(從default_factory推斷)和 key 被添加到 defaultdict。
接下來,查看有關 Python 地圖功能的教程。