日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python中的defaultdict方法

發(fā)布時(shí)間:2023/11/29 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中的defaultdict方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

字典(dictionary)是Python中一種常用的數(shù)據(jù)類型。不同于其他由數(shù)字索引的序列,字典是用"鍵"(key)來(lái)索引的。通常表示為dict(key: val, ...),有以下特征:

  • 鍵可以是任何不可變(immutable)數(shù)據(jù)類型,如數(shù)字,字符串和僅包含不可變數(shù)據(jù)類型的元組
  • 每個(gè)鍵必須是唯一的
  • 字典中每一項(xiàng)的順序是任意的

1. KeyError異常

在Python中如果訪問(wèn)字典里不存在的鍵,會(huì)出現(xiàn)KeyError異常。有些時(shí)候,字典中每個(gè)鍵都存在默認(rèn)值是很方便的,例如下面的例子:

>>> bag = ['apple', 'orange', 'cherry', 'apple', ... 'apple', 'cherry', 'blueberry'}] >>> count = {} >>> for fruit in bag: ... count[fruit] += 1 ... Traceback (most recent call last):File "<stdin>", line 2, in <module> KeyError: 'apple'

上例統(tǒng)計(jì)列表bag中單詞出現(xiàn)次數(shù),并記錄在字典count中。單詞沒(méi)出現(xiàn)一次,count中對(duì)應(yīng)的鍵值會(huì)增加一。但是在實(shí)習(xí)運(yùn)行代碼時(shí),每當(dāng)單詞第一次被統(tǒng)計(jì)就會(huì)出現(xiàn)'KeyError'異常,這是因?yàn)樗⒉辉谧值鋍ount中,Python中dict對(duì)象并不存在默認(rèn)值。


2. 使用判斷語(yǔ)句檢查

因此,在單詞第一次被統(tǒng)計(jì)時(shí),需要在count中給每個(gè)鍵設(shè)定一個(gè)默認(rèn)值1,這可以用一個(gè)判斷語(yǔ)句來(lái)實(shí)現(xiàn):

>>> for fruit in bag: ... if fruit not in count: #如果不存在,添加 ... count[fruit] = 1 ... else: ... count[fruit] += 1 ... >>> count {'apple': 3, 'blueberry': 1, 'orange': 1, 'cherry': 2}

3. 使用dict.setdefault()方法

dict.setdefault(key[,default])方法接受兩個(gè)參數(shù),第一個(gè)是鍵的名稱,第二個(gè)參數(shù)是默認(rèn)值。在調(diào)用時(shí)如果鍵存在字典中,會(huì)返回它的值;如果不存在,則會(huì)自動(dòng)把它添加進(jìn)字典中并返回默認(rèn)值,default的默認(rèn)值為None。此外,default的值還可以是列表,元組,集合和字典等。

>>> d = {'a': 1, 'b': 2} >>> d.setdefault('a') #鍵存在并返回他的值 1 >>> d.setdefault('c', 3) #添加鍵-值 3 >>> d.setdefault('d') #只添加鍵,默認(rèn)值為None >>> d {'a': 1, 'b': 2, 'c': 3, 'd': None}

接下來(lái)用它來(lái)實(shí)現(xiàn)上一個(gè)例子:

>>> count = {} >>> for fruit in bag: ... count.setdefault(fruit, 0) ... count[fruit] += 1 ... >>> count {'apple': 3, 'orange': 1, 'cherry': 2, 'blueberry': 1}

或者更簡(jiǎn)潔一些:

>>> for fruit in bag: ... count[fruit] = count.setdefault(fruit, 0) + 1

4. 使用collections.defaultdict類

class collections.defaultdict([default_factory[, ...]])

defaultdict是Python內(nèi)建dict類的一個(gè)子類,第一個(gè)參數(shù)為default_factory屬性提供初始值,默認(rèn)為None。它覆蓋一個(gè)方法并添加一個(gè)可寫實(shí)例變量。它的其他功能與dict相同,但會(huì)為一個(gè)不存在的鍵提供默認(rèn)值,從而避免KeyError異常。之前例子的實(shí)現(xiàn)如下:

>>> from collections import defaultdict >>> count = defaultdict(int) >>> for fruit in bag: ... count[fruit] += 1 ... >>> count defaultdict(<class 'int'>, {'apple': 3, 'orange': 1, 'cherry': 2, 'blueberry': 1})

4.1. 類型名稱作為初始化函數(shù)參數(shù)

首先它可以接受類型名稱來(lái)作為初始化函數(shù)的參數(shù),比如之前的例子中以int類名稱作為參數(shù)。除了標(biāo)準(zhǔn)dict操作,它還支持__missing__(key)方法,通過(guò)參考官方文檔,它的機(jī)制如下:

如果default_factory為None,會(huì)拋出以key為參數(shù)的KeyError異常。

>>> d = defaultdict() #default_factory為None >>> d['eric'] Traceback (most recent call last):File "<stdin>", line 1, in <module> KeyError: 'eric'

如果default_factory不為None, 此處原文為:

"It is called without arguments to provide a default value for the given key, this value is inserted in the dictionary for the key, and returned."。
大概翻譯了下:它會(huì)在不接收任何參數(shù)的情況下被調(diào)用,來(lái)為給定的鍵提供默認(rèn)值,這個(gè)值會(huì)被添加進(jìn)字典并被返回。 >>> d = defaultdict(list) #default_factory是列表名稱 >>> d['eric'] #訪問(wèn)一個(gè)不存在的鍵 [] #添加并返回默認(rèn)值(一個(gè)空列表) >>> d defaultdict(<class 'list'>, {'eric': []})

因?yàn)閐efaultdict是dict的一個(gè)子類,事實(shí)上訪問(wèn)一個(gè)不存在的鍵時(shí),dict類中的__getitem__方法會(huì)調(diào)用子類中__missing__()方法(但它不能直接被dict的實(shí)例調(diào)用),并且返回或拋出__missing__()方法所返回的值和拋出的異常。因此,如果調(diào)用default_factory引發(fā)一個(gè)異常,該異常傳播不變(propagated unchanged)。

請(qǐng)注意除__getitem__()之外的任何操作都不會(huì)調(diào)用__missing __()。 這意味著像正常的字典一樣,get()將返回None作為默認(rèn)值,而不是使用default_factory。

另外,還可以給字典中的鍵映射多個(gè)值,具體方法是把多個(gè)值儲(chǔ)存在另一個(gè)容器里(如列表,元組,字典等)。是否使用列表或集合的選擇取決于預(yù)期用途:使用列表來(lái)保存每一項(xiàng)的插入順序;如果要消除重復(fù)的項(xiàng)(不關(guān)心順序),可以使用元組。

>>> from collections import defaultdict >>> d = defaultdict(list) >>> for i in [1,2,3]: ... d['eric'].append(i) ... >>> d defaultdict(<class 'list'>, {'eric': [1, 2, 3]})>>> d['amy'] = {} >>> d['amy']['a'] = 1 >>> d defaultdict(<class 'list'>, {'eric': [1, 2, 3], 'amy': {'a': 1}})

可以看出,給定默認(rèn)值的類型之后并不意味著字典中所有值都必須是此類型,也可以是其他類型。還能使用相應(yīng)的方法來(lái)對(duì)行操作,如列表的append和pop等方法。

4.2. 可調(diào)用函數(shù)作為初始化函數(shù)參數(shù)

除了接受類型名稱作為初始化函數(shù)的參數(shù)之外,還可以使用任何不帶參數(shù)的可調(diào)用函數(shù),并以該函數(shù)返回值作為默認(rèn)值。例如,定義函數(shù)zero()讓默認(rèn)值為0:

>>> from collections import defaultdict >>> def zero(): ... return 0 ... >>> d = defaultdict(zero) >>> d['eric'] 0 >>> d defaultdict(<function zero at 0x100662e18>, {'eric': 0})

或者使用lambda函數(shù):

>>> d = defaultdict(lambda: 0) >>> d['amy'] 0 >>> d defaultdict(<function <lambda> at 0x1019d3d90>, {'amy': 0})

需要注意的是, defaultdict接受的參數(shù)必須是可調(diào)用的。若直接傳遞數(shù)字0,就會(huì)出現(xiàn)TyptError的異常。

>>> d = defaultdict(0) Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: first argument must be callable or None
聲明:

文章僅供學(xué)習(xí)及參考,禁止轉(zhuǎn)載。

參考:
  • Python3.6: defaultdict
  • Python中defaultdict方法的使用

總結(jié)

以上是生活随笔為你收集整理的Python中的defaultdict方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。