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

defaultdict?在python中的基本用法

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

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

defaultdict 的基本用法

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

from collections import defaultdict
# 使用 int 作為默認(rèn)工廠函數(shù),意味著當(dāng)訪問(wèn)不存在的鍵時(shí),會(huì)創(chuàng)建一個(gè)默認(rèn)值為 0 的新條目。
# int() 會(huì)返回 0
word_counts = defaultdict(int)
# 訪問(wèn)一個(gè)不存在的鍵 'apple',它會(huì)自動(dòng)創(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 主要用于簡(jiǎn)化代碼,避免在使用普通字典時(shí)頻繁地檢查鍵是否存在。這在以下場(chǎng)景中特別有用:

計(jì)數(shù) (Counting): 統(tǒng)計(jì)列表中元素的出現(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' 不存在,會(huì)自動(dòng)創(chuàng)建為 0,然后加 1
print(counts)

顯然,defaultdict 的代碼更簡(jiǎn)潔。

分組 (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' 不存在,會(huì)自動(dòng)創(chuàng)建為空列表 []
print(words_by_initial)

這里,list 作為默認(rèn)工廠函數(shù),當(dāng)訪問(wèn)不存在的鍵時(shí),會(huì)創(chuàng)建一個(gè)空列表。

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

假設(shè)你有一些銷售數(shù)據(jù),想要計(jì)算每個(gè)產(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)用對(duì)象,而不僅僅是內(nèi)置類型(如 intlist、set)。

int: 默認(rèn)值為 0

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

list: 默認(rèn)值為 []。

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

set: 默認(rèn)值為 set()

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

str: 默認(rèn)值為 ''。

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á)式:

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() 也可以實(shí)現(xiàn)類似的功能,但 defaultdict 通常更簡(jiǎn)潔高效。

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

使用 dict.setdefault() 進(jìn)行計(jì)數(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() 進(jìn)行分組:

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']}

對(duì)比:

  • 簡(jiǎn)潔性defaultdict 在很多情況下代碼更簡(jiǎn)潔,因?yàn)樗∪チ孙@式的條件判斷或 setdefault 調(diào)用。
  • 性能: 對(duì)于大量操作,defaultdict 通常比重復(fù)調(diào)用 setdefault 稍微快一些,因?yàn)樗苊饬嗣看卧L問(wèn)時(shí)都可能進(jìn)行的鍵查找和方法調(diào)用開(kāi)銷。
  • 語(yǔ)義defaultdict 明確表達(dá)了“如果鍵不存在,就創(chuàng)建一個(gè)默認(rèn)值”的意圖,使得代碼更易讀。
  • 靈活性defaultdict 允許你指定一個(gè)工廠函數(shù),而 setdefault 每次都需要提供一個(gè)具體的默認(rèn)值。雖然 setdefault 也可以結(jié)合函數(shù)調(diào)用,但不如 defaultdict 的設(shè)計(jì)直接。

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

相關(guān)文章

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

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

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

    pycharm from lxml import etree標(biāo)紅問(wèn)題及解決

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

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

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

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

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

    聽(tīng)歌識(shí)曲--用python實(shí)現(xiàn)一個(gè)音樂(lè)檢索器的功能

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

    Python如何建立多個(gè)值和單個(gè)鍵的映射

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

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

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

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

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

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

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

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

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

最新評(píng)論

玉屏| 南乐县| 黄浦区| 丹棱县| 鄂伦春自治旗| 宣城市| 天峨县| 罗山县| 井冈山市| 兴国县| 通榆县| 波密县| 沽源县| 伊吾县| 美姑县| 桐乡市| 长顺县| 延津县| 平昌县| 库尔勒市| 柳州市| 广西| 巴林右旗| 正宁县| 扬州市| 徐闻县| 华亭县| 金溪县| 泰安市| 灯塔市| 昔阳县| 武清区| 甘谷县| 嘉禾县| 孟州市| 丹江口市| 贞丰县| 容城县| 思茅市| 长顺县| 郎溪县|