一、Python字典概述
在Python中,字典(dictionary)是一種非常常用的數據類型。它是一種可變容器模型,也是一種無序的鍵(key)和值(value)的對應關係,通過鍵可以快速地查到對應的值。Python字典的特點是:無序、可變、鍵唯一。
字典是Python中內置的一種數據結構,可以通過{}表示,其中鍵值對之間用冒號(:)隔開,每個鍵值對之間用逗號(,)隔開。
{
Key1: Value1,
Key2: Value2,
Key3: Value3,
...
}
下面是一個簡單的Python字典示例:
person = {
'name': 'Tom',
'age': 18,
'gender': 'male'
}
如上所示,可以通過這種方式快速定義一個字典,其中三對鍵值分別是’name’、’age’和’gender’。可以通過鍵來獲取其對應的值,例如:
print(person['name']) # 輸出'Tom'
通過上述代碼可以看到,打印出了鍵’name’所對應的值’Tom’。
二、Python defaultdict的概述
Python的collections模塊提供了defaultdict類,它是字典的一個子類,具有與普通字典相同的方法,但是可以為字典的任何不存在的鍵提供默認值。
默認值可以通過創建defaultdict對象時指定,並且所有鍵的默認值默認都是None。
defaultdict類是Python字典的擴展,它提供了一種更加優雅和易於使用的方法,她比Python字典更加高效,因為它沒有在字典中添加缺失的鍵,而是直接在內部實現中使用默認值。
通過使用defaultdict類可以提高程序的可讀性和性能。
三、Python defaultdict的用法
使用defaultdict可以在字典中查找不存在的鍵時返回一個默認值。可以通過創建defaultdict對象來指定所有鍵的默認值,例如:
from collections import defaultdict
nums = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6]
d = defaultdict(int) # 所有鍵默認值為0
for num in nums:
d[num] += 1
print(d)
上述示例中,使用了defaultdict來實現對nums序列中每個元素的計數。通過創建defaultdict(int)類實例,它默認將字典中不存在的鍵的值返回0,使用d[num] += 1代碼實現計數。最後打印出得到的字典結果:
defaultdict(, {1: 1, 2: 2, 3: 2, 4: 2, 5: 2, 6: 1})
我們可以省略在字典中添加不存在鍵的步驟,這一過程可以交給defaultdict自動完成。
四、Python defaultdict的實戰應用
下面我們將介紹一些實際應用場景中的Python defaultdict的用法。
1. 嵌套字典(Nested Dictionary)
在Python字典中,如果鍵本身又是另一個字典,我們就稱其為嵌套字典。我們可以通過使用defaultdict來處理對於不存在的鍵訪問,可以使得代碼更加簡潔和高效。
from collections import defaultdict
# 用來初始化默認字典
def default_factory():
return [0, defaultdict(int)]
nested_dict = defaultdict(default_factory)
nested_dict['a'][1]['b'] = 1
print(datetime_dict)
上述示例中,可以看到首先我們定義一個名為default_factory的函數,用於初始化默認字典。在程序的後續操作中,我們通過default_factory指定每個鍵的默認值,可以看到這裡我們使用了一個長度為2的列表,第一個元素是數字0,第二個元素是defaultdict(int)。
在示例中,我們對nested_dict[‘a’][1][‘b’]賦值為1,如果這個鍵不存在,那麼它會被默認初始化為0和一個空的字典,這裡的[1]是指index為1的元素,也就是嵌套字典中的第二個。
最終輸出的結果如下:
defaultdict(, {'a': [0, defaultdict(, {'b': 1})]})
2. 使用lambda表達式設置默認值
除了可以使用defaultdict來指定默認值,還可以使用lambda表達式來設置默認值。可以看下面的一個簡單的例子:
from collections import defaultdict
d = defaultdict(lambda:'None')
d['a'] = 'This is a'
d['b'] = 'This is b'
print(d['a']) # 輸出'This is a'
print(d['b']) # 輸出'This is b'
print(d['c']) # 輸出'None'
在上述示例中,我們使用了lambda表達式設置值的默認值,使用d[‘a’] = ‘This is a’和d[‘b’] = ‘This is b’來設置字典的值,如果字典中不存在對應的鍵的值,就會返回’None’。
3. 統計每個單詞的頻率
下面是一個更加實際的應用場景,用Python defaultdict來統計一個英文文本中每個單詞出現的頻率。
import re
from collections import defaultdict
filename = 'input.txt'
words_freq = defaultdict(int)
with open(filename) as f:
for line in f:
words = re.findall('\w+', line)
for word in words:
words_freq[word] += 1
print(words_freq)
此處,我們使用了Python內置的re模塊,通過正則表達式來提取輸入文本中的單詞,使用defaultdict(int)來初始化一個字典,將每個單詞作為鍵,它們在文中出現的次數作為值。
最後,我們通過打印 words_freq 字典,得到如下所示的結果:
defaultdict(, {'hello': 2, 'world': 2, 'python': 3, 'is': 2, 'awesome': 1})
4. 初始化有向圖
下面是一個實際應用場景的示例:通過使用Python defaultdict來初始化一個有向圖。
from collections import defaultdict
graph = defaultdict(list)
graph['A'].append('B')
graph['A'].append('C')
graph['B'].append('D')
graph['C'].append('D')
graph['D'].append('E')
graph['E'].append('F')
print(graph)
上述代碼中,我們使用defaultdict(list)初始化一個空字典,將每個鍵的值初始化為一個空列表。在代碼的後續操作中,我們使用append方法來將每個節點相鄰的節點添加到列表中。
在上述示例中,可以看到我們初始化了有向圖中6個節點,分別是’A’、’B’、’C’、’D’、’E’和’F’。最終輸出的結果如下:
defaultdict(, {'A': ['B', 'C'], 'B': ['D'], 'C': ['D'], 'D': ['E'], 'E': ['F']})
五、總結
Python defaultdict是Python中重要的一個數據結構工具,它提供了一種非常高效和易於使用的方法來處理字典為空時出現的關鍵錯誤。使用Python defaultdict可以提高代碼的可讀性,並且具有更好的性能。在實際的編程過程中,可以靈活使用Python defaultdict來提高程序的效率和性能。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/152856.html