Python中defaultdict方法常見的使用方法及問題解答
前言
在 Python 中, defaultdict
是 collections
模塊提供的一個(gè)非常有用的類,它是內(nèi)置字典類型 dict
的子類。 defaultdict
的主要特點(diǎn)是 自動(dòng)處理字典中不存在的鍵,避免在使用普通字典時(shí)因訪問不存在的鍵而拋出 KeyError
異常。
核心特點(diǎn)
- 自動(dòng)初始化默認(rèn)值:當(dāng)訪問一個(gè)不存在的鍵時(shí),
defaultdict
會(huì)調(diào)用指定的默認(rèn)工廠函數(shù)(default_factory
)生成一個(gè)初始值,確定了字典中值的類型。 - 簡(jiǎn)化代碼:無需手動(dòng)檢查鍵是否存在,適合需要分組、統(tǒng)計(jì)或聚合數(shù)據(jù)的場(chǎng)景。
基本語法
from collections import defaultdict d = defaultdict(default_factory)
- default_factory:一個(gè)可調(diào)用對(duì)象(如
list
,int
,set
,str
或自定義函數(shù)),用于生成默認(rèn)值。
常見使用場(chǎng)景
1. 分組數(shù)據(jù)(默認(rèn)值為列表)
將數(shù)據(jù)按鍵分組,類似 SQL 的 GROUP BY
:
from collections import defaultdict data = [("apple", "fruit"), ("carrot", "vegetable"), ("apple", "fruit")] grouped = defaultdict(list) for name, category in data: grouped[category].append(name) print(grouped) # 輸出:defaultdict(<class 'list'>, {'fruit': ['apple', 'apple'], 'vegetable': ['carrot']})
2. 計(jì)數(shù)(默認(rèn)值為整數(shù))
統(tǒng)計(jì)元素出現(xiàn)次數(shù):
from collections import defaultdict text = "apple banana apple orange banana" words = text.split() count = defaultdict(int) for word in words: count[word] += 1 print(count) # 輸出:defaultdict(<class 'int'>, {'apple': 2, 'banana': 2, 'orange': 1})
3. 集合操作(默認(rèn)值為集合)
避免重復(fù)值:
from collections import defaultdict pairs = [("a", 1), ("b", 2), ("a", 3)] unique = defaultdict(set) for key, value in pairs: unique[key].add(value) print(unique) # 輸出:defaultdict(<class 'set'>, {'a': {1, 3}, 'b': {2}})
4. 嵌套字典
構(gòu)建多層嵌套結(jié)構(gòu):
from collections import defaultdict nested = defaultdict(lambda: defaultdict(int)) nested["fruit"]["apple"] += 1 nested["vegetable"]["carrot"] += 2 print(nested["fruit"]) # 輸出:defaultdict(<class 'int'>, {'apple': 1}) print(nested["unknown_key"]) # 輸出:defaultdict(<class 'int'>, {})
注意事項(xiàng)
- default_factory 必須可調(diào)用:例如
list
、int
是類(構(gòu)造函數(shù)),而list()
或int()
的返回值不可作為工廠。 - 僅對(duì) d[key] 有效:使用
d.get(key)
或key in d
不會(huì)觸發(fā)默認(rèn)值生成。 - 性能:與普通字典性能接近,適合高頻插入操作。
與普通字典對(duì)比
# 普通字典需要手動(dòng)處理缺失鍵 d = {} key = "unknown" if key not in d: d[key] = [] d[key].append(1) # defaultdict 自動(dòng)處理 d = defaultdict(list) d["unknown"].append(1)
總結(jié)
defaultdict
簡(jiǎn)化了需要初始化默認(rèn)值的字典操作,特別適合數(shù)據(jù)聚合、分組和統(tǒng)計(jì)場(chǎng)景。通過合理選擇 default_factory
(如 list
、int
、set
或自定義函數(shù)),可以大幅提升代碼簡(jiǎn)潔性和可讀性。
在 Python 中,defaultdict
繼承自 dict
,因此它的 鍵(Key)和值(Value)的類型規(guī)則與普通字典一致,但也有一些細(xì)節(jié)需要注意。以下是詳細(xì)說明:
1. 鍵(Key)的類型
規(guī)則:鍵必須是 不可變類型(Immutable) 且 可哈希(Hashable)。
允許的類型:
- 基本類型:
int
,float
,str
,bool
,None
- 不可變?nèi)萜鳎?code>tuple(但元組內(nèi)的元素也必須不可變)
frozenset
(不可變集合)- 用戶自定義的不可變對(duì)象(需正確實(shí)現(xiàn)
__hash__
和__eq__
方法)。
- 基本類型:
禁止的類型:
- 可變類型:
list
,dict
,set
- 包含可變?cè)氐?nbsp;
tuple
(例如(1, [2, 3])
)。
- 可變類型:
示例:
from collections import defaultdict # 合法鍵 d = defaultdict(int) d["apple"] = 10 # 字符串作為鍵 ? d[123] = 20 # 整數(shù)作為鍵 ? d[(1, 2)] = 30 # 不可變?cè)M作為鍵 ? # 非法鍵(會(huì)拋出 TypeError) d[[1, 2]] = 40 # 列表不可哈希 ? d[{"a": 1}] = 50 # 字典不可哈希 ?
2. 值(Value)的類型
規(guī)則:值可以是 任意類型,包括可變對(duì)象。
允許的類型:
- 基本類型(
int
,float
,str
等) - 可變?nèi)萜鳎?code>list,
dict
,set
) - 自定義對(duì)象、函數(shù)、類實(shí)例等。
- 基本類型(
示例:
from collections import defaultdict # 值可以是列表(可變) d_list = defaultdict(list) d_list["fruits"].append("apple") # 值可以是字典(可變) d_dict = defaultdict(dict) d_dict["data"]["count"] = 10 # 值可以是自定義對(duì)象 class MyClass: pass d_obj = defaultdict(MyClass) obj = d_obj["instance"] # 自動(dòng)生成一個(gè) MyClass 實(shí)例
3. default_factory 的返回值
default_factory
是一個(gè)可調(diào)用對(duì)象(如 list
, int
或自定義函數(shù)),它決定了 當(dāng)鍵不存在時(shí),默認(rèn)值的類型。例如:
defaultdict(list)
:默認(rèn)值是一個(gè)空列表([]
)。defaultdict(int)
:默認(rèn)值是0
。defaultdict(lambda: "unknown")
:默認(rèn)值是字符串"unknown"
。
值的類型完全由 default_factory 決定,與鍵的類型無關(guān)。
4. 嵌套 defaultdict 的鍵值
可以創(chuàng)建多層嵌套的 defaultdict
,鍵的規(guī)則依然適用:
from collections import defaultdict # 嵌套 defaultdict(值類型是另一個(gè) defaultdict) nested = defaultdict(lambda: defaultdict(int)) # 合法操作 nested["fruit"]["apple"] += 1 # 鍵為 "fruit"(字符串)和 "apple"(字符串) nested[123][(4, 5)] = 2 # 鍵為 123(整數(shù))和 (4, 5)(不可變?cè)M) # 非法操作(內(nèi)層鍵非法) nested["data"][[1, 2]] = 3 # 內(nèi)層鍵為列表,不可哈希 ?
5. 鍵和值的可變性總結(jié)
特性 | 鍵(Key) | 值(Value) |
---|---|---|
類型限制 | 必須不可變且可哈希 | 可以是任意類型 |
可變性 | 不可變 | 可以可變 |
示例 | int , str , tuple | list , dict , 自定義對(duì)象 |
常見問題解答
Q1:可以用 list 作為鍵嗎?
- 否。列表是可變類型,不可哈希。若需用類似列表的結(jié)構(gòu)作為鍵,可以轉(zhuǎn)換為不可變的
tuple
。
Q2:可以用 defaultdict 作為鍵嗎?
- 否。defaultdict 是可變對(duì)象,不可哈希。只有不可變類型(如
frozenset
)可以作為鍵。
Q3:值可以是函數(shù)或類嗎?
- 是。例如:
d = defaultdict(type) # 默認(rèn)值是類對(duì)象 d["my_class"] = MyClass
總結(jié)
- 鍵:必須為不可變且可哈希的類型(如
str
,int
,tuple
)。 - 值:可以是任意類型(包括可變對(duì)象),具體由
default_factory
決定。 - 嵌套結(jié)構(gòu):可以自由嵌套
defaultdict
,但需確保每一層的鍵合法。
到此這篇關(guān)于Python中defaultdict方法常見的使用方法及問題解答的文章就介紹到這了,更多相關(guān)Python defaultdict方法使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python函數(shù)之zip函數(shù)的介紹與實(shí)際應(yīng)用
zip() 函數(shù)用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的對(duì)象(python2 返回的是這些元組組成的列表 ),下面這篇文章主要給大家介紹了關(guān)于Python函數(shù)之zip函數(shù)實(shí)際應(yīng)用的相關(guān)資料,需要的朋友可以參考下2022-03-03升級(jí)keras解決load_weights()中的未定義skip_mismatch關(guān)鍵字問題
這篇文章主要介紹了升級(jí)keras解決load_weights()中的未定義skip_mismatch關(guān)鍵字問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python學(xué)習(xí)_幾種存取xls/xlsx文件的方法總結(jié)
今天小編就為大家分享一篇Python學(xué)習(xí)_幾種存取xls/xlsx文件的方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python?中的?list、tuple、set、dict的底層實(shí)現(xiàn)小結(jié)
本文詳細(xì)介紹了Python中四種常用數(shù)據(jù)結(jié)構(gòu)——list、tuple、set和dict的底層實(shí)現(xiàn),包括它們的存儲(chǔ)方式、性能特點(diǎn)以及適用場(chǎng)景,感興趣的朋友一起看看吧2025-03-03Python 僅獲取響應(yīng)頭, 不獲取實(shí)體的實(shí)例
今天小編就為大家分享一篇Python 僅獲取響應(yīng)頭, 不獲取實(shí)體的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08在python中求分布函數(shù)相關(guān)的包實(shí)例
這篇文章主要介紹了在python中求分布函數(shù)相關(guān)的包實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04matplotlib中l(wèi)egend位置調(diào)整解析
這篇文章主要介紹了matplotlib中l(wèi)egend位置調(diào)整解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12