利用Python defaultdict提高字典操作效率

一、什麼是Python字典?

Python字典是一種類似於映射的數據結構,由一系列鍵值對組成。字典中的鍵必須是唯一的、不可變的類型,例如字元串、整數或元組,而值可以是任意類型的Python對象。對於許多應用程序來說,Python字典是一種最方便的數據結構,它允許快速訪問、插入和刪除元素,並支持非常快速的查找操作。

但是,當我們需要按照鍵來維護一個列表或者集合時,普通的字典操作會顯得比較繁瑣。例如,假設我們需要為大量文檔中的每個單詞創建一個列表,以存儲相關的所有文檔。使用普通的Python字典實現這個任務,需要在每次更新文檔列表時都檢查該鍵是否已經存在。這將導致代碼變得複雜,而且在處理大數據量時會導致性能問題。這時,Python的defaultdict就可以派上用場了。

二、defaultdict的介紹

  Python的defaultdict模塊提供了一種替代標準字典類的方式,它使我們能夠輕鬆地創建遞歸結構,並將默認值與每個新建鍵相關聯。

  from collections import defaultdict
  
  word_docs = defaultdict(list)
  for doc in documents:
      for word in doc.split():
          word_docs[word].append(doc)

這裡,word_docs是一個字典,它的值是文檔列表。然而,與通常的Python字典不同的是,在首次訪問新的鍵時,它會自動創建一個空列表。這使我們能夠避免在更新列表之前檢查每個鍵是否存在的問題,從而使代碼更加簡潔、易於閱讀。

三、defaultdict的示例運用

1. defaultdict處理較為複雜的數據結構

例如,我們想要存儲一個單詞的所有後綴以及這些後綴出現在哪些單詞中。用普通的字典,我們需要顯式創建新的列表。但用defaultdict,我們可以通過訪問新的鍵來自動創建新的列表。下面是一個例子:

  from collections import defaultdict
  
  suffix_trie = defaultdict(lambda: defaultdict(list))

  for word in word_list:
      for i in range(len(word)):
          suffix = word[i:]
          suffix_trie[suffix][word].append(i)

上面這個字典含有一個元素,其鍵是一個後綴,其值是一個嵌套的字典,其鍵是出現過該後綴的單詞,其值是單詞中的後綴出現位置的列表。因此,執行以下代碼:

  print(suffix_trie["age"]["page"])

假設”page”是在列表中的一個單詞。下面是輸出結果:

  [1]

這表示「age」這個後綴出現在「page」的索引1的位置。

2. 字典的嵌套和其他數據類型的嵌套

有時候我們希望在字典中嵌套其他數據類型,如列表、元組或集合。默認字典與此類嵌套相當擅長,因為它能夠自動為新鍵創建新的嵌套數據結構。

  from collections import defaultdict
  
  # 創建一個字典的嵌套列表,存儲單詞的後綴以及這些後綴出現在哪些單詞中
  suffix_dict = defaultdict(list)

  for word in word_list:
      for i in range(1, len(word) + 1):
          suffix_dict[word[-i:]].append(word)

這會創建一個字典,其鍵是所有單詞的後綴,值是包含所有原始單詞的列表,其後綴等於該鍵。例如,該字典將包含以下條目:「car」:[「scar」, 「car」]。

3. defaultdict處理其他數據結構

另一個常見的用途是用defaultdict處理堆棧或隊列。例如,我們可以創建一個嵌套列表的defaultdict來模擬一個簡單的FIFO隊列:

  from collections import defaultdict
  
  queue_dict = defaultdict(list)

  def enqueue(queue_dict, element, priority=0):
      queue_dict[priority].append(element)

  def dequeue(queue_dict):
      priority = min(queue_dict.keys())
      element = queue_dict[priority].pop(0)
      if not queue_dict[priority]:
          del queue_dict[priority]
      return element

  enqueue(queue_dict, 'A', priority=1)
  enqueue(queue_dict, 'B', priority=2)
  enqueue(queue_dict, 'C', priority=1)

  print(dequeue(queue_dict))  # A
  print(dequeue(queue_dict))  # C
  print(dequeue(queue_dict))  # B

四、總結

在許多情況下,Python的defaultdict可以提高代碼的可讀性和效率。值得注意的是,它並不是完美的,因為它可能會因為嘗試創建大量缺失鍵而導致內存和I/O的開銷。但是,在許多場景中,該模塊可以使代碼更加清晰、易於處理,而且性能不俗。同時,需要注意在體量較大的字典數據結構場合使用它時,也不能夠完全擺脫時間和空間的考慮。

對於那些需要處理大量缺失鍵的應用程序,例如文本處理系統,defaultdict提供了一種解決方案來優化代碼的內部操作,提高代碼的可讀性和性能。

原創文章,作者:INQP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/137105.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
INQP的頭像INQP
上一篇 2024-10-04 00:17
下一篇 2024-10-04 00:17

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論