Python defaultdict:提升字典性能和易用性的利器

一、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-tw/n/152856.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-13 06:07
下一篇 2024-11-13 06:07

相關推薦

  • Python字典去重複工具

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

    編程 2025-04-29
  • Python刷課:優化學習體驗的利器

    Python刷課作為一種利用自動化技術優化學習體驗的工具已經被廣泛應用。它可以幫助用戶自動登錄、自動答題等,讓用戶在學習過程中可以更加專註於知識本身,提高效率,增加學習樂趣。 一、…

    編程 2025-04-29
  • lsw2u1:全能編程開發工程師的利器

    lsw2u1是一款多功能工具,可以為全能編程開發工程師提供便利的支持。本文將從多個方面對lsw2u1做詳細闡述,並給出對應代碼示例。 一、快速存取代碼段 在日常開發中,我們總會使用…

    編程 2025-04-29
  • Python中取出字典中對應鍵的值

    如何使用Python在字典中獲取特定鍵的值?這是Python編程中必須掌握的技能之一。本文將通過多個方面來詳細講解Python如何取出字典中對應鍵的值。 一、通過鍵名獲取值 當我們…

    編程 2025-04-29
  • 如何優化 Git 性能和重構

    本文將提供一些有用的提示和技巧來優化 Git 性能並重構代碼。Git 是一個非常流行的版本控制系統,但是在處理大型代碼倉庫時可能會有一些性能問題。如果你正在處理這樣的問題,本文將會…

    編程 2025-04-29
  • Python如何遍歷字典中的key和value

    本文將詳細講解Python中如何遍歷字典中的key和value,包括多種遍歷方式以及在遍歷過程中的一些應用場景。 一、遍歷字典中的key和value 在Python中,字典是一種無…

    編程 2025-04-29
  • Python字典列表去重

    這篇文章將介紹如何使用Python對字典列表進行去重操作,並且從多個方面進行詳細的闡述。 一、基本操作 首先我們需要了解Python字典列表去重的基本操作。Python中提供了一種…

    編程 2025-04-28
  • Python字典輸出key對應的value

    本文將從多個方面詳細闡述Python字典輸出key對應的value,包括獲取單個和多個key的value值、如何判斷一個key是否存在、如何遍歷所有的key-value對和如何刪除…

    編程 2025-04-28
  • Python中字典的特點

    Python中的字典是一種無序的、可變的鍵(key)值(value)對集合。字典是Python的核心數據結構之一,它具有以下幾個特點: 一、隨機性 字典是無序的,即字典中的鍵值對沒…

    編程 2025-04-28
  • 使用@Transactional和分表優化數據交易系統的性能和可靠性

    本文將詳細介紹如何使用@Transactional和分表技術來優化數據交易系統的性能和可靠性。 一、@Transactional的作用 @Transactional是Spring框…

    編程 2025-04-28

發表回復

登錄後才能評論