在 Python 中應該如何以及何時使用 Defaultdict?

已發表: 2022-10-06

在本教程中,您將學習如何在使用 Python 字典時使用 Python 集合模塊中的defaultdict來更好地處理 KeyErrors。

在 Python 中,字典是一種強大的內置數據結構,它以鍵值對的形式存儲數據。 您將使用鍵來訪問字典並訪問值。

但是,當您的 Python 腳本中有多個字典在代碼執行期間被修改時,您經常會遇到 KeyErrors。 您可以通過幾種不同的方式來處理它們。

在本教程中,您將學習:

  • KeyErrors 是什麼以及它們出現的原因
  • 如何處理 KeyErrors
  • 如何使用 Python 的 defaultdict(繼承自內置 dict 類的子類)更好地處理丟失的鍵

讓我們開始!

Python 中的 KeyError 是什麼?

1

在定義 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

如何在 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 語句

2

另一種處理 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中的默認字典

python-defaultdict

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 默認字典示例

Defaultdict-Examples-1

接下來,我們將編寫幾個示例來了解 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 地圖功能的教程。