摘要:如果兩個(gè)對(duì)象是相同的,那么它們的散列值一定是相同的。也就是說,一個(gè)可散列對(duì)象必須同時(shí)滿足以下三個(gè)條件支持方法,并且通過方法所獲得的散列值是不變的支持通過方法來判斷兩個(gè)對(duì)象的值是否相等若,則必有。
字典
dict類型是python語言的基石,所以python對(duì)于dict類型實(shí)現(xiàn)了高度優(yōu)化,而 散列表 則是字典類型性能突出的根本原因。
什么是可散列的數(shù)據(jù)類型定義:如果一個(gè)對(duì)象是可散列的,那么在這個(gè)對(duì)象的生命周期中,它的散列值是始終不變的,而且這個(gè)對(duì)象必定實(shí)現(xiàn)__hash__()方法。 另外,可散列對(duì)象還必須實(shí)現(xiàn) __eq__()方法,這樣才能保證兩個(gè)相同類型的對(duì)象可以進(jìn)行比較。如果兩個(gè)對(duì)象是相同的,那么它們的散列值一定是相同的。
也就是說,一個(gè)可散列對(duì)象必須同時(shí)滿足以下三個(gè)條件:
支持hash()方法,并且通過__hash__()方法所獲得的散列值是不變的;
支持通過__eq__()方法來判斷兩個(gè)對(duì)象的值是否相等;
若 a==b,則必有 hash(a) == hash(b)。
原子不可變數(shù)據(jù)類型(str、bytes和數(shù)值類型)都是可散列類型;
frozenset類型也是可散列的;
當(dāng)一個(gè)元組中所包含的值都是可散列的,該元組才是可散列的。
下例展示了創(chuàng)建字典的不同方式
>>> d1 = dict(one=1, two=2, three=3) >>> d2 = {"one":1, "two":2, "three":3} >>> d3 = dict(zip(["one", "two", "three"], [1,2,3])) >>> d4 = dict([("two", 2), ("one", 1), ("three", 3)]) >>> d5 = dict({"one":1, "two":2, "three":3}) >>> d1 == d2 == d3 == d4 == d5 True處理找不到的鍵
假設(shè)有一個(gè)字典dict,當(dāng)程序試圖查找一個(gè)不存在的鍵值 dict[k] 時(shí),會(huì)拋出一個(gè)異常KeyError,這個(gè)行為復(fù)合python所信奉的“快速失敗”哲學(xué)。當(dāng)然,我們可以采用dict.get(k, default)來代替dict[k],當(dāng)找不到鍵k時(shí),返回默認(rèn)值default,但是,這并不是一個(gè)高效的方式,也不是一個(gè)可取的方法。
1. setdefault方法下面是一個(gè)案例:
dict_demo = {} print(dict_demo) key = "name" dict_demo.get(key) dict_demo.setdefault(key, []) print(dict_demo) dict_demo.setdefault("pass", "123456") print(dict_demo)
運(yùn)行結(jié)果如下:
{} {"name": []} {"name": [], "pass": "123456"}
代碼中第一個(gè) setdefault 中未找到 key,于是把一個(gè)空列表賦值到該鍵值
第二個(gè) setdefault 未找到鍵"pass",將一個(gè)字符串賦值給該鍵
經(jīng)過兩個(gè)setdefault之后,該字典含有兩個(gè)鍵值對(duì),該方法主要用于對(duì)字典進(jìn)行更新
2.defaultdict 處理空缺鍵的一個(gè)選擇在用戶創(chuàng)建defaultdict對(duì)象時(shí),需要給它配置一個(gè)為找不到的鍵創(chuàng)造默認(rèn)值的方法
具體而言,就是在實(shí)例化一個(gè)defaultdict對(duì)象時(shí),需要給構(gòu)造方法賦予一個(gè)可調(diào)用對(duì)象,這個(gè)可調(diào)用對(duì)象在__getitem__碰到找不到的鍵時(shí),讓__getitem__返回一個(gè)默認(rèn)值。
key = "name" dict_demo2 = collections.defaultdict(list) print(dict_demo2) dict_demo2[key].append((1,2)) print(dict_demo2) dict_demo2["pass"] print(dict_demo2)
運(yùn)行結(jié)果:
defaultdict(, {}) defaultdict( , {"name": [(1, 2)]}) defaultdict( , {"name": [(1, 2)], "pass": []})
dict_demo2一開始是一個(gè)空字典,不存在任何鍵值,當(dāng)運(yùn)行dict_demo2[key]時(shí),其中包含一下三個(gè)步驟:
(1) 調(diào)用list()創(chuàng)建一個(gè)新列表
(2) 把這個(gè)新列表作為值,key作為鍵,放入dd中
(3) 返回這個(gè)列表的引用(這也是能夠進(jìn)行append操作的原因)
如果在鍵值不確定的情況下可以考慮使用defaultdict
3 特殊方法__missing__所有映射類型在處理找不到的鍵時(shí),都會(huì)牽扯__missing__方法,當(dāng)__getitem__操作找不到鍵值時(shí),就會(huì)調(diào)用__missing__方法,而不是直接拋出異常。
__missing__方法只會(huì)被__getitem__方法調(diào)用
class StrKeyDict0(dict):
def __missing__(self, key): if isinstance(key, str): raise KeyError(key) return self[str(key)] def get(self, key, default=None): try: return self[key] except KeyError: return default def __contains__(self, key): return key in self.keys() or str(key) in self.keys()
if name == "__main__":
d = StrKeyDict0([("2", "two"), ("4", "four")]) print(d["2"]) print(d[4]) try: print(d[1]) except KeyError: print("keyerror") print(d.get("2")) print(d.get(4)) try: print(d.get(1, "N/A")) except KeyError: print("keyerror") print(2 in d) print(4 in d)
運(yùn)行結(jié)果:
two four keyerror two four N/A True True
__missing__方法中將鍵key轉(zhuǎn)化為str類型后再次嘗試獲取字典d中相應(yīng)的鍵值
所以可以看到,即便字典中沒有 4 這個(gè)鍵,但是依然能夠正確獲取其在字典中相應(yīng)的值,但是由于字典中不存在 1 或 "1" 這樣的鍵,所以無法獲取d[1]
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/42242.html
摘要:常量的值近似為。在后傳入一個(gè)整數(shù)可以保證該域至少有這么多的寬度表示浮點(diǎn)數(shù)保留位小數(shù)常量的值近似為。 1. 數(shù)字 類型 int, float, bool, complex type() 查看變量類型 isinstance(a, int) 查看變量類型 showImg(https://segmentfault.com/img/remote/1460000016789047); 運(yùn)算符 ...
摘要:第六章抽象本章會(huì)介紹如何將語句組織成函數(shù)。關(guān)鍵字參數(shù)和默認(rèn)值目前為止,我們使用的參數(shù)都是位置參數(shù),因?yàn)樗鼈兊奈恢煤苤匾?,事?shí)上比它們的名字更重要。參數(shù)前的星號(hào)將所有值放置在同一個(gè)元祖中。函數(shù)內(nèi)的變量被稱為局部變量。 第六章:抽象 本章會(huì)介紹如何將語句組織成函數(shù)。還會(huì)詳細(xì)介紹參數(shù)(parameter)和作用域(scope)的概念,以及遞歸的概念及其在程序中的用途。 懶惰即美德 斐波那契數(shù)...
摘要:的基本數(shù)據(jù)類型中的變量不需要聲明。在里,只有一種整數(shù)類型,表示為長整型,沒有中的。字符串的截取的語法格式如下變量頭下標(biāo)尾下標(biāo)索引值以為開始值,為從末尾的開始位置。列表列表是中使用最頻繁的數(shù)據(jù)類型。注意構(gòu)造包含或個(gè)元素的元組的特殊語法規(guī)則。 1、python3的基本數(shù)據(jù)類型 Python 中的變量不需要聲明。每個(gè)變量在使用前都必須賦值,變量賦值以后該變量才會(huì)被創(chuàng)建。在 Python 中,...
摘要:基本數(shù)據(jù)類型基本數(shù)據(jù)類型比較簡單,通過以下例子演示運(yùn)行結(jié)果如下通用序列操作索引通過索引獲取序列的單個(gè)元素,也可以使用負(fù)數(shù)索引。設(shè)置參數(shù)步長,負(fù)數(shù)步長表示從右側(cè)開始提取元素。注意相同類型的序列才可以進(jìn)行連接操作。 showImg(https://segmentfault.com/img/bV09Mw?w=805&h=327); 0. 基本數(shù)據(jù)類型 基本數(shù)據(jù)類型比較簡單,通過以下例子演示:...
閱讀 1081·2021-11-18 10:07
閱讀 2494·2021-10-14 09:42
閱讀 5510·2021-09-22 15:45
閱讀 673·2021-09-03 10:29
閱讀 3578·2021-08-31 14:28
閱讀 1985·2019-08-30 15:56
閱讀 3125·2019-08-30 15:54
閱讀 1103·2019-08-29 11:32