一、默認字典概述
在Python的collections模塊中,有一種叫做defaultdict的數據結構,它是dict類的一個子類,它能夠自動為字典中不存在的鍵提供默認值。
from collections import defaultdict
# 設置列表為默認值
d = defaultdict(list)
# 字典中沒有key為"name"的鍵,則插入鍵"name",值為[],即一個空列表
# 並將返回值作為這個列表的引用
d["name"].append("John")
在默認字典中,如果訪問字典中不存在的鍵,則默認會自動創建這個鍵並且對應的值是在創建defaultdict時所指定的默認值,最常見的情況就是使用列表為默認值。
二、默認字典的應用
默認字典的應用非常廣泛,在以下幾個方面,我們可以看到默認字典的強大和方便
1. 計數器Counter
Counter是collections模塊中的一個計數器,它使用默認字典作為容器,用來計數相同元素出現的次數。
from collections import Counter
# 使用Counter統計列表中各元素出現的次數
L = [1, 2, 1, 3, 2, 1, 2, 4, 5, 1]
c = Counter(L)
print(c) # Counter({1: 4, 2: 3, 3: 1, 4: 1, 5: 1})
使用Counter的過程,實際上是為每個元素初始化一個默認值,並每次遍歷到這個元素是增加計數器。
2. 節省代碼行數
使用默認字典可以省去對鍵是否存在的判斷,能大大減少代碼行數。比如以下代碼:
# 對於每個鍵,統計它出現的次數,沒有出現過則將次數初始化為0
for key in keys:
if key not in d:
d[key] = 0
d[key] += 1
這樣的代碼可以使用下面的代碼來替代:
for key in keys:
d[key] += 1
3. 容器嵌套
在容器嵌套的情況下,使用默認字典可以避免鍵映射到不存在的值的情況,從而使代碼更為緊湊。
# 學生成績均分統計(d為默認字典,可以方便地追加學生成績)
d = defaultdict(list)
for name, score in scores:
d[name].append(score)
# 輸出每位學生平均分
for name, scores in d.items():
avg_score = sum(scores) / len(scores)
print(f"{name}: {avg_score}")
三、默認字典的用法
雖然默認字典非常便利實用,但是需要注意以下幾個問題:
1. 默認值需要可迭代
當我們使用默認字典來創建一個默認空列表的時候,在將這個列表元素加入到默認字典中時,需要的是一個可迭代的對象。
from collections import defaultdict
d = defaultdict(list)
d["name"].append("John") # 正確
d["name"].append("Mike") # 正確
d["name"] = "John" # 錯誤,字符串不可迭代
2. 默認值的函數要注意副作用
在使用默認值函數時,需要注意函數是否有副作用,建議使用lambda表達式。
# 正確方式:不具有副作用的lambda表達式
d = defaultdict(lambda: [])
# 錯誤方式:具有副作用的函數
def foo():
print("hello")
return []
d = defaultdict(foo)
d[1] # 輸出"hello",並返回一個空列表
d[2] # 輸出"hello",並返回一個空列表
3. 默認值函數的應用
我們可以任意定製默認值函數,比如追蹤創建了哪些鍵:
def key_tracker():
c = []
def tracker():
c.append(len(c))
return []
return tracker
tracker = key_tracker()
d = defaultdict(tracker)
_ = d["name1"]
_ = d["name2"]
_ = d["name3"]
print(tracker()) # [0, 1, 2]
四、總結
Python中的默認字典可謂是一個功能強大且便捷實用的數據結構,它大大了簡化了容器中鍵的初始化和增加操作。在實際的Python開發中,我們可以充分發揮其威力,優化代碼,簡化程序邏輯。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/284686.html
微信掃一掃
支付寶掃一掃