亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

python學(xué)習(xí)筆記 關(guān)于字典

cnsworder / 2478人閱讀

摘要:如果兩個(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

相關(guān)文章

  • Python 3 學(xué)習(xí)筆記之——數(shù)據(jù)類型

    摘要:常量的值近似為。在后傳入一個(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)算符 ...

    Riddler 評(píng)論0 收藏0
  • Python基礎(chǔ)教程》第六章--讀書筆記

    摘要:第六章抽象本章會(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ù)...

    AnthonyHan 評(píng)論0 收藏0
  • python3學(xué)習(xí)筆記(2)----python的數(shù)據(jù)類型

    摘要:的基本數(shù)據(jù)類型中的變量不需要聲明。在里,只有一種整數(shù)類型,表示為長整型,沒有中的。字符串的截取的語法格式如下變量頭下標(biāo)尾下標(biāo)索引值以為開始值,為從末尾的開始位置。列表列表是中使用最頻繁的數(shù)據(jù)類型。注意構(gòu)造包含或個(gè)元素的元組的特殊語法規(guī)則。 1、python3的基本數(shù)據(jù)類型 Python 中的變量不需要聲明。每個(gè)變量在使用前都必須賦值,變量賦值以后該變量才會(huì)被創(chuàng)建。在 Python 中,...

    陸斌 評(píng)論0 收藏0
  • python學(xué)習(xí)筆記02-數(shù)據(jù)類型

    摘要:基本數(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ù)類型比較簡單,通過以下例子演示:...

    jcc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<