python中setdefault方法以及底層原理分析
1、setdefault 方法 功能
setdefault是Python中字典的一個(gè)方法, 它用于在字典中查找指定鍵 如果鍵存在, 則返回對(duì)應(yīng)的值; 如果鍵不存在,則在字典中添加該鍵,并將其值設(shè)置為指定的默認(rèn)值
2、setdefault 用法詳解
dict.setdefault(key, default_value)
其中,key為要查找或添加的鍵,default_value為鍵不存在時(shí)設(shè)置的默認(rèn)值。
如果省略default_value,則默認(rèn)為None。
3、setdefault 底層原理
- 底層實(shí)現(xiàn):
在Python中,字典是一種無(wú)序的鍵值對(duì)集合,它的底層實(shí)現(xiàn)是基于哈希表。
哈希表是一種根據(jù)關(guān)鍵字直接訪問(wèn)內(nèi)存位置的數(shù)據(jù)結(jié)構(gòu),通過(guò)哈希函數(shù)將關(guān)鍵字映射到對(duì)應(yīng)的內(nèi)存位置。
Python中的字典是通過(guò)拉鏈法(chaining)實(shí)現(xiàn)的哈希表。
拉鏈法是指每個(gè)哈希桶(bucket)(下方有解釋)中存儲(chǔ)一個(gè)鏈表,哈希值相同的鍵值對(duì)會(huì)被 插入到同一個(gè)鏈表中。當(dāng)需要查找或插入一個(gè)鍵值對(duì)時(shí),先計(jì)算出該鍵的哈希值,然后根據(jù)哈希值找到對(duì)應(yīng)的哈希桶,再在該哈希桶對(duì)應(yīng)的鏈表中查找或插入鍵值對(duì)。
下面是setdefault方法的底層實(shí)現(xiàn)步驟:
- 計(jì)算要查找或添加的鍵的哈希值,找到對(duì)應(yīng)的哈希桶。
- 遍歷哈希桶對(duì)應(yīng)的鏈表,查找是否有鍵與要查找或添加的鍵相同。
- 如果找到了相同的鍵,則返回該鍵對(duì)應(yīng)的值。
- 如果沒(méi)有找到相同的鍵,則在鏈表頭部添加一個(gè)新的鍵值對(duì),并將鍵的值設(shè)置為默認(rèn)值。
- 返回默認(rèn)值作為該鍵的值。
上面中什么是哈希桶?
?哈希桶是哈希表中存儲(chǔ)元素的容器,它是一個(gè)固定大小的數(shù)組,每個(gè)元素都是一個(gè)鏈表或其他容器。
哈希桶的大小是根據(jù)哈希表的負(fù)載因子(load factor)和哈希表中元素?cái)?shù)量來(lái)計(jì)算的。
在Python中,哈希桶是一個(gè)由哈希表實(shí)現(xiàn)的動(dòng)態(tài)數(shù)組,每個(gè)哈希桶中存儲(chǔ)的是一條鏈表,鏈表中的每個(gè)節(jié)點(diǎn)都是一個(gè)鍵值對(duì)。
當(dāng)需要查找或插入一個(gè)鍵值對(duì)時(shí),先計(jì)算出該鍵的哈希值,然后根據(jù)哈希值找到對(duì)應(yīng)的哈希桶,
再在該哈希桶對(duì)應(yīng)的鏈表中查找或插入鍵值對(duì)。
- 哈希桶的大小通常是一個(gè)質(zhì)數(shù),這是為了保證哈希函數(shù)的均勻性和哈希表的性能。
- 如果哈希桶的大小比較小,會(huì)導(dǎo)致哈希沖突(hash collision)的概率增大,從而降低哈希表的性能;
- 如果哈希桶的大小比較大,會(huì)浪費(fèi)內(nèi)存空間。
在Python中,哈希桶的大小是動(dòng)態(tài)調(diào)整的,當(dāng)哈希表中元素?cái)?shù)量達(dá)到一定閾值時(shí),Python會(huì)自動(dòng)擴(kuò)容哈希表,增加哈希桶的數(shù)量,在保證哈希函數(shù)均勻性和哈希表性能的同時(shí),提高哈希表的存儲(chǔ)容量。
總之,哈希桶是哈希表中存儲(chǔ)元素的容器,它是哈希表實(shí)現(xiàn)的關(guān)鍵之一,直接影響哈希表的性能和存儲(chǔ)容量。
setdefault方法的底層實(shí)現(xiàn)步驟:
- 1、計(jì)算要查找或添加的鍵的哈希值,找到對(duì)應(yīng)的哈希桶。
- 2、遍歷哈希桶對(duì)應(yīng)的鏈表,查找是否有鍵與要查找或添加的鍵相同。
- 3、如果找到了相同的鍵,則返回該鍵對(duì)應(yīng)的值。
- 4、如果沒(méi)有找到相同的鍵,則在鏈表頭部添加一個(gè)新的鍵值對(duì),并將鍵的值設(shè)置為默認(rèn)值。
- 5、返回默認(rèn)值作為該鍵的值。?
底層實(shí)現(xiàn)的過(guò)程示例:
d = {"a": 1, "b": 2}
# 查找鍵'c'
if 'c' in d:
value = d['c']
else:
d['c'] = 3
value = 3
# value = 3
# 修改鍵'a'的默認(rèn)值
if 'a' in d:
value = d['a']
else:
d['a'] = 3
value = 3
# value = 1
手動(dòng)模擬了setdefault方法的實(shí)現(xiàn)過(guò)程。當(dāng)查找鍵'c'時(shí),因?yàn)樵撴I不存在,所以通過(guò)添加鍵值對(duì)的方式將鍵'c'的值設(shè)置為默認(rèn)值3。
當(dāng)查找鍵'a'時(shí),因?yàn)樵撴I已經(jīng)存在,所以返回鍵'a'對(duì)應(yīng)的值1,而不修改其默認(rèn)值。
總之,setdefault方法是Python字典的一個(gè)有用的方法,它可以方便地查找和添加鍵值對(duì)。
對(duì)于大型的數(shù)據(jù)處理應(yīng)用程序來(lái)說(shuō),使用哈希表來(lái)實(shí)現(xiàn)字典可以極大地提高程序的效率和性能。
4、setdefault 示例方法
4.1 添加一個(gè)新鍵和默認(rèn)值
d = {"a": 1, "b": 2}
d.setdefault("c", 3)
print(d) # 輸出:{'a': 1, 'b': 2, 'c': 3}
# 字典d本來(lái)并沒(méi)有鍵為'c'的元素,使用setdefault方法可以添加一個(gè)新的鍵'c'和默認(rèn)值3
4.2 修改已有鍵的默認(rèn)值
d = {"a": 1, "b": 2}
d.setdefault("a", 3)
print(d) # 輸出:{"a": 1, "b": 2}
# 字典d已經(jīng)有鍵'a',使用setdefault方法仍然會(huì)返回鍵'a'對(duì)應(yīng)的值1,而不會(huì)修改它的默認(rèn)值。
4.3 可以省略默認(rèn)值參數(shù)
d = {"a": 1, "b": 2}
d.setdefault("c")
print(d) # 輸出:{"a": 1, "b": 2, "c": None}
# 省略了默認(rèn)值參數(shù),此時(shí)默認(rèn)值為None
4.4 在字典中嵌套一個(gè)列表
d = {}
d.setdefault("list", []).append(1)
d.setdefault("list", []).append(2)
print(d) # 輸出:{"list": [1, 2]}
# 使用setdefault方法為字典d添加一個(gè)鍵'list',并將其值設(shè)置為一個(gè)空列表。然后,使用列表的append方法向該列表中添加元素1和2。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中的循環(huán)結(jié)構(gòu)問(wèn)題
這篇文章主要介紹了python中的循環(huán)結(jié)構(gòu)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Pandas+Numpy+Sklearn隨機(jī)取數(shù)的實(shí)現(xiàn)示例
使用Python、pandas、numpy、scikit-learn來(lái)實(shí)現(xiàn)隨機(jī)打亂、抽取和切割數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
Python 的lru_cache裝飾器使用簡(jiǎn)介
這篇文章主要介紹了Python 的lru_cache 裝飾器使用簡(jiǎn)介,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03
Python中7刪除文件的7種方法實(shí)現(xiàn)與對(duì)比
本文提供了有關(guān)如何使用各種模塊和方法在Python中刪除文件的詳盡教程,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-09-09
python時(shí)間日期操作方法實(shí)例小結(jié)
這篇文章主要介紹了python時(shí)間日期操作方法,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)日期時(shí)間的轉(zhuǎn)換、計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2020-02-02
基于Python采集爬取微信公眾號(hào)歷史數(shù)據(jù)
這篇文章主要介紹了基于Python采集爬取微信公眾號(hào)歷史數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Django2.2配置xadmin的實(shí)現(xiàn)
這篇文章主要介紹了Django2.2配置xadmin的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Python報(bào)錯(cuò)AssertionError:can only test a c
這篇文章主要介紹了Python報(bào)錯(cuò)AssertionError:can only test a child proc問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09

