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