最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

defaultdict?在python中的基本用法

 更新時間:2025年06月16日 17:22:34   作者:秋時的雨  
Python的collections.defaultdict是字典子類,自動處理缺失鍵并生成默認值(如int、list),簡化代碼邏輯,高效適用于計數(shù)、分組等場景,相比dict.setdefault更直觀靈活,本文介紹defaultdict在python中的作用,感興趣的朋友一起看看吧

collections.defaultdict 是 Python collections 模塊中提供的一個字典(dict)的子類。它與普通的字典非常相似,但有一個關鍵的區(qū)別:當你嘗試訪問一個不存在的鍵時,defaultdict 不會引發(fā) KeyError 異常,而是會自動為該鍵生成一個默認值。

defaultdict 的基本用法

defaultdict 的構(gòu)造函數(shù)需要一個“默認工廠函數(shù)”(default_factory)作為參數(shù)。這個工廠函數(shù)是一個不接受任何參數(shù)的可調(diào)用對象,它會在訪問不存在的鍵時被調(diào)用,并將其返回值作為該鍵的默認值。

from collections import defaultdict
# 使用 int 作為默認工廠函數(shù),意味著當訪問不存在的鍵時,會創(chuàng)建一個默認值為 0 的新條目。
# int() 會返回 0
word_counts = defaultdict(int)
# 訪問一個不存在的鍵 'apple',它會自動創(chuàng)建并賦值為 int() 的結(jié)果 (0)
print(word_counts['apple'])  # 輸出: 0
# 現(xiàn)在 'apple' 鍵存在了,我們可以像普通字典一樣操作它
word_counts['apple'] += 1
print(word_counts['apple'])  # 輸出: 1
word_counts['banana'] += 1
word_counts['apple'] += 1
print(word_counts)  # 輸出: defaultdict(<class 'int'>, {'apple': 2, 'banana': 1})

為什么使用 defaultdict?

defaultdict 主要用于簡化代碼,避免在使用普通字典時頻繁地檢查鍵是否存在。這在以下場景中特別有用:

計數(shù) (Counting): 統(tǒng)計列表中元素的出現(xiàn)次數(shù),或字符串中字符的出現(xiàn)次數(shù)。

使用普通字典:

counts = {}
my_list = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
for item in my_list:
    if item in counts:
        counts[item] += 1
    else:
        counts[item] = 1
print(counts)

使用 defaultdict(int)

from collections import defaultdict
counts = defaultdict(int)
my_list = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
for item in my_list:
    counts[item] += 1  # 如果 'item' 不存在,會自動創(chuàng)建為 0,然后加 1
print(counts)

顯然,defaultdict 的代碼更簡潔。

分組 (Grouping): 將具有相同特征的元素分組。例如,根據(jù)首字母將單詞分組。

使用普通字典:

words_by_initial = {}
words = ['apple', 'banana', 'apricot', 'cat', 'dog']
for word in words:
    initial = word[0]
    if initial in words_by_initial:
        words_by_initial[initial].append(word)
    else:
        words_by_initial[initial] = [word]
print(words_by_initial)

使用 defaultdict(list)

from collections import defaultdict
words_by_initial = defaultdict(list)
words = ['apple', 'banana', 'apricot', 'cat', 'dog']
for word in words:
    initial = word[0]
    words_by_initial[initial].append(word) # 如果 'initial' 不存在,會自動創(chuàng)建為空列表 []
print(words_by_initial)

這里,list 作為默認工廠函數(shù),當訪問不存在的鍵時,會創(chuàng)建一個空列表。

累加/聚合 (Accumulating/Aggregating): 對某個鍵下的值進行累加或進行其他聚合操作。

假設你有一些銷售數(shù)據(jù),想要計算每個產(chǎn)品的總銷售額:

from collections import defaultdict
sales_data = [
    {'product': 'A', 'amount': 100},
    {'product': 'B', 'amount': 50},
    {'product': 'A', 'amount': 75},
    {'product': 'C', 'amount': 200},
    {'product': 'B', 'amount': 120},
]
total_sales = defaultdict(float) # 或者 int,根據(jù)你的數(shù)據(jù)類型
for item in sales_data:
    product = item['product']
    amount = item['amount']
    total_sales[product] += amount
print(total_sales)
# 輸出: defaultdict(<class 'float'>, {'A': 175.0, 'B': 170.0, 'C': 200.0})

defaultdict 的工廠函數(shù)

defaultdict 的 default_factory 可以是任何可調(diào)用對象,而不僅僅是內(nèi)置類型(如 int、list、set)。

int: 默認值為 0。

d = defaultdict(int)
print(d['a']) # 0

list: 默認值為 []。

d = defaultdict(list)
d['a'].append(1)
print(d) # defaultdict(<class 'list'>, {'a': [1]})

set: 默認值為 set()。

d = defaultdict(set)
d['a'].add(1)
d['a'].add(2)
print(d) # defaultdict(<class 'set'>, {'a': {1, 2}})

str: 默認值為 ''

d = defaultdict(str)
print(d['a']) # ''

自定義函數(shù):

def create_default_value():
    return "Not Found"
d = defaultdict(create_default_value)
print(d['unknown_key']) # Not Found

lambda 表達式:

d = defaultdict(lambda: {'count': 0, 'items': []})
d['product1']['count'] += 1
d['product1']['items'].append('item_x')
print(d['product1']) # {'count': 1, 'items': ['item_x']}

defaultdict 與 dict.setdefault() 的比較

在某些情況下,dict.setdefault() 也可以實現(xiàn)類似的功能,但 defaultdict 通常更簡潔高效。

dict.setdefault(key, default_value) 方法會在字典中查找 key。如果 key 存在,則返回其對應的值;如果 key 不存在,則將 key 插入字典并賦值為 default_value,然后返回 default_value。

使用 dict.setdefault() 進行計數(shù):

counts = {}
my_list = ['apple', 'banana', 'apple']
for item in my_list:
    counts[item] = counts.setdefault(item, 0) + 1
print(counts) # {'apple': 2, 'banana': 1}

使用 dict.setdefault() 進行分組:

words_by_initial = {}
words = ['apple', 'banana', 'apricot']
for word in words:
    initial = word[0]
    words_by_initial.setdefault(initial, []).append(word)
print(words_by_initial) # {'a': ['apple', 'apricot'], 'b': ['banana']}

對比:

  • 簡潔性defaultdict 在很多情況下代碼更簡潔,因為它省去了顯式的條件判斷或 setdefault 調(diào)用。
  • 性能: 對于大量操作,defaultdict 通常比重復調(diào)用 setdefault 稍微快一些,因為它避免了每次訪問時都可能進行的鍵查找和方法調(diào)用開銷。
  • 語義defaultdict 明確表達了“如果鍵不存在,就創(chuàng)建一個默認值”的意圖,使得代碼更易讀。
  • 靈活性defaultdict 允許你指定一個工廠函數(shù),而 setdefault 每次都需要提供一個具體的默認值。雖然 setdefault 也可以結(jié)合函數(shù)調(diào)用,但不如 defaultdict 的設計直接。

到此這篇關于defaultdict 在python中的作用的文章就介紹到這了,更多相關defaultdict python內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python3.5的包存放的具體路徑

    python3.5的包存放的具體路徑

    在本篇內(nèi)容里小編給大家分享了一篇關于python3.5的包存放的具體路徑相關內(nèi)容,有需要的朋友們可以參考下。
    2020-08-08
  • pycharm from lxml import etree標紅問題及解決

    pycharm from lxml import etree標紅問題及解決

    這篇文章主要介紹了pycharm from lxml import etree標紅問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python封裝數(shù)據(jù)庫連接池詳解

    Python封裝數(shù)據(jù)庫連接池詳解

    這篇文章主要介紹了Python封裝數(shù)據(jù)庫連接池詳解,文章圍繞主題相關內(nèi)容展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • python+selenium+autoit實現(xiàn)文件上傳功能

    python+selenium+autoit實現(xiàn)文件上傳功能

    這篇文章主要介紹了python+selenium+autoit實現(xiàn)文件上傳功能,需要的朋友可以參考下
    2017-08-08
  • 聽歌識曲--用python實現(xiàn)一個音樂檢索器的功能

    聽歌識曲--用python實現(xiàn)一個音樂檢索器的功能

    本篇文章中主要介紹了用python實現(xiàn)一個音樂檢索器,類似于QQ音樂的搖一搖識曲,有興趣的同學可以了解一下。
    2016-11-11
  • Python如何建立多個值和單個鍵的映射

    Python如何建立多個值和單個鍵的映射

    在Python中,常見的字典只能映射單個鍵到單個值,若需映射單個鍵到多值,可以通過將值存儲于列表或集合中實現(xiàn),使用列表可以保持元素插入順序,而使用集合則可以去重,collections模塊的defaultdict類簡化了此類多值字典的創(chuàng)建過程
    2024-09-09
  • 深入分析Python中Lambda函數(shù)的用法

    深入分析Python中Lambda函數(shù)的用法

    lambda函數(shù)是Python中常用的內(nèi)置函數(shù),又稱為匿名函數(shù)。和普通函數(shù)相比,它只有函數(shù)體,省略了def和return,使得結(jié)構(gòu)看起來更精簡。本文將詳細說說Lambda函數(shù)的用法,需要的可以參考一下
    2022-12-12
  • 解決json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)錯誤

    解決json.decoder.JSONDecodeError: Expecting value:&n

    這篇文章主要介紹了解決json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)錯誤,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Python參數(shù)的傳遞幾種情況實例詳解

    Python參數(shù)的傳遞幾種情況實例詳解

    這篇文章主要給大家介紹了關于Python參數(shù)的傳遞的相關資料,在Python中傳遞參數(shù)指的是函數(shù)或方法中的參數(shù)傳輸方式,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-09-09
  • Python繪制餅圖、圓環(huán)圖的實例

    Python繪制餅圖、圓環(huán)圖的實例

    這篇文章主要介紹了Python繪制餅圖、圓環(huán)圖的實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評論

湖南省| 兴安县| 新邵县| 邓州市| 临武县| 金平| 含山县| 甘肃省| 盘锦市| 栾川县| 商河县| 福鼎市| 清丰县| 威远县| 邵武市| 博爱县| 巴彦淖尔市| 沐川县| 莱芜市| 绥芬河市| 高密市| 中方县| 大余县| 修武县| 鹿泉市| 北川| 任丘市| 奉贤区| 凌海市| 海南省| 托克托县| 岑巩县| 德保县| 闸北区| 湖南省| 榆社县| 烟台市| 屏东县| 靖西县| 同心县| 荥阳市|