一、什麼是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