Python中的defaultdict方法

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

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

1. KeyError異常

在Python中如果訪問字典里不存在的鍵,會出現KeyError異常。有些時候,字典中每個鍵都存在默認值是很方便的,例如下面的例子:

>>> 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'

上例統計列表bag中單詞出現次數,并記錄在字典count中。單詞沒出現一次,count中對應的鍵值會增加一。但是在實習運行代碼時,每當單詞第一次被統計就會出現'KeyError'異常,這是因為它并不在字典count中,Python中dict對象并不存在默認值。


2. 使用判斷語句檢查

因此,在單詞第一次被統計時,需要在count中給每個鍵設定一個默認值1,這可以用一個判斷語句來實現:

>>> 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])方法接受兩個參數,第一個是鍵的名稱,第二個參數是默認值。在調用時如果鍵存在字典中,會返回它的值;如果不存在,則會自動把它添加進字典中并返回默認值,default的默認值為None。此外,default的值還可以是列表,元組,集合和字典等。

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

接下來用它來實現上一個例子:

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

或者更簡潔一些:

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

4. 使用collections.defaultdict類

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

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

>>> 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. 類型名稱作為初始化函數參數

首先它可以接受類型名稱來作為初始化函數的參數,比如之前的例子中以int類名稱作為參數。除了標準dict操作,它還支持__missing__(key)方法,通過參考官方文檔,它的機制如下:

如果default_factoryNone,會拋出以key為參數的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."。
大概翻譯了下:它會在不接收任何參數的情況下被調用,來為給定的鍵提供默認值,這個值會被添加進字典并被返回。
>>> d = defaultdict(list)    #default_factory是列表名稱
>>> d['eric']    #訪問一個不存在的鍵
[]            #添加并返回默認值(一個空列表)
>>> d
defaultdict(<class 'list'>, {'eric': []})

因為defaultdictdict的一個子類,事實上訪問一個不存在的鍵時,dict類中的__getitem__方法會調用子類中__missing__()方法(但它不能直接被dict的實例調用),并且返回或拋出__missing__()方法所返回的值和拋出的異常。因此,如果調用default_factory引發一個異常,該異常傳播不變(propagated unchanged)。

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

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

>>> 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}})

可以看出,給定默認值的類型之后并不意味著字典中所有值都必須是此類型,也可以是其他類型。還能使用相應的方法來對行操作,如列表的appendpop等方法。

4.2. 可調用函數作為初始化函數參數

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

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

或者使用lambda函數:

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

需要注意的是, defaultdict接受的參數必須是可調用的。若直接傳遞數字0,就會出現TyptError的異常。

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

聲明:

文章僅供學習及參考,禁止轉載。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395013.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git撤銷commit 并保存之前的修改

撤銷并保留修改 參數 –soft # 先進行commit &#xff0c;之后后悔啦$ git commit -am "對首篇報告研究員字段改為author_name"執行git log $ git logcommit 3d6788f577faba5e1d408e372031c81beee79749Author: yous <yous.com>Date: Thu Dec 14 10:08:36 2017 …

php替換中文,PHP中文替換

//定義編碼header( Content-Type:text/html;charsetutf-8 );$wordsarray(我,你,他);$content"測一測我是不是違禁詞";$bannedgenerateRegularExpression($words);//檢查違禁詞$res_bannedcheck_words($banned,$content);write_html($content,$res_banned);/*** descr…

secoclient隧道保活超時或協商超時_推薦:承德市隧道led大屏廠家電話【聯豐智慧科技】...

通過為大型隧道施工建設搭建全覆蓋式的定位&#xff0c;可以有效施工的效率、項目現場的保障能力。安裝隧道門禁能解決哪些問題&#xff1f;近年來&#xff0c;我國交通建設正處于高速發展的階段&#xff0c;在交通建設中&#xff0c;工程安防工作也越發受到&#xff0c;越來越…

JavaScript Essentials:如何為循環而煩惱

by Zell Liew由Zell Liew JavaScript Essentials&#xff1a;如何為循環而煩惱 (JavaScript Essentials: how to wrap your head around for loops) Let’s say you want to run a function, bounceBall, four times. How would you do it? Like this?假設您要運行一次功能b…

python中的類的成員變量以及property函數

1 python類的各種變量 1.1 全局變量 在類外定義的變量。 1.2 類變量 定義在類里面&#xff0c;所有的函數外面的變量。這個變量只有一份&#xff0c;是所有的對象共有的。在類外用“類.”來引用。 1.3 實例變量 用self.xxx在類的任何函數中定義的變量就是實例變量。在類內用“s…

C++常用的系統函數

數學<math.h>&#xff1a; 1 三角函數 double sin (double); double cos (double); double tan (double); 2 反三角函數 double asin (double); 結果介于[-PI/2, PI/2] double acos (double); 結果介于[0, PI] double atan (double); 反正切(主值), 結果介于[-PI/2, PI/2…

網頁特效java代碼,美化網頁常用特效代碼

1&#xff0e;讓文字不停地滾動&#xff1c;MARQUEE&#xff1e;滾動文字&#xff1c;/MARQUEE&#xff1e;2&#xff0e;記錄并顯示網頁的最后修改時間&#xff1c;script languageJavaScript&#xff1e;document.write("最后更新時間: " document.lastModified …

作業,兩次實驗

實驗一&#xff1a; 1 編程打印5行的倒三角形&#xff0c;第一行打印9個*&#xff0c;第二行7個*&#xff0c;……第5行打印1個* #include<stdio.h>int main(){printf("*********\n *******\n *****\n ***\n *\n");return 0;} 總結 注意換行以及位置的…

javaweb和ajax使用查詢出來的數據做下拉菜單_區塊鏈瀏覽器實用指南篇:利用鏈上數據把握減半行情...

進入2020年&#xff0c;加密貨幣市場最熱的話題當屬“減半”了。在減半行情的推動下&#xff0c;以BTC為首的減半幣種展現出了極強的上行趨勢。如何抓住這一波行情&#xff0c;評估正確時機&#xff1f;當然&#xff0c;這個問題的答案可以說是爭議紛紛&#xff0c;但有一個參考…

純函數式編程語言_純功能編程語言如何改變您的生活。

純函數式編程語言by Andrea Zanin由Andrea Zanin 純功能編程語言如何改變您的生活。 (How a purely functional programming language can change your life.) I believe everyone should learn Haskell, even if you won’t use it in your work. It’s beautiful, and it ch…

Win10 教育版

Windows 10 版本 1607 引入了專為 K-12 機構的特有需求而設計的兩個版本&#xff1a;Windows 10 專業教育版和 Windows 10 教育版。 這些版本為不斷發展的 K-12 教育 IT 環境提供特定于教育的默認設置。Windows 10 專業教育版Windows 10 專業教育版基于 Windows 10 專業版的商業…

java中的排序方法,Java中的排序比較方式:自然排序和比較器排序

這里所說到的Java中的排序并不是指插入排序、希爾排序、歸并排序等具體的排序算法。而是指執行這些排序算法時&#xff0c;比較兩個對象“大小”的比較操作。我們很容易理解整型的 i>j 這樣的比較方式&#xff0c;但當我們對多個對象進行排序時&#xff0c;如何比較兩個對象…

ImageView縮放選項

ImageView.ScaleType 將圖片邊界縮放到所在view邊界時的縮放選項。 Options for scaling the bounds of an image to the bounds of this view. 不同選項含義 CENTER 居中&#xff0c;不縮放。 Center the image in the view, but perform no scaling. CENTER_CROP 居中&#x…

css命名_CSS命名約定將節省您的調試時間

css命名I have heard lots of developers say they hate CSS. In my experience, this comes as a result of not taking the time to learn CSS.我聽到很多開發人員說他們討厭CSS。 以我的經驗&#xff0c;這是因為沒有花時間學習CSS。 Korean ??韓文?? ??: ??? ?…

電腦刪除快捷鍵_可能是知乎最有用的 Windows 快捷鍵學習指南。

在任何地方搜索“快捷鍵的使用”&#xff0c;你都能找到無數的列表清單。但你應該不會專門去對照一個個的表單&#xff0c;企圖把所有快捷鍵全部掌握吧&#xff1f;經過三年左右的總結和視頻制作&#xff0c;Topbook 大概產出了 20 支左右的快捷鍵、快捷操作及應用等相關的視頻…

java自動依照日期建表,腳本根據一個表中的日期字段填充每月匯總表

你想在這里做兩件事 . 我假設您正在使用Oracle(因為您正在使用Java) .首先&#xff0c;您希望對每個用戶的每日交易進行分組 .創建一個名為 tempTable 的臨時表 .使用 to_char(currentdate, yyyy/mm/dd) 對它們進行分組 .INSERT INTO tempTableSELECTuserid,resourceid,doc_nam…

算法專題 普及組【2008】三3 C++版

轉載于:https://www.cnblogs.com/qilinart/articles/5914850.html

linux用戶修改用戶shell

要拒絕系統用戶登錄,可以將其shell設置為/usr/sbin/nologin或者/bin/false # usermod -s /usr/sbin/nologin username 或者 # usermod -s /bin/false username /bin/false/bin/false什么也不做只是返回一個錯誤狀態,然后立即退出。將用戶的shell設置為/bin/false,用戶會無法登錄…

【覆蓋安裝】通用測試點

需要xmind文檔請留言將會私發。 轉載于:https://www.cnblogs.com/syw20170419/p/10457600.html

instagram架構_如何創建像Instagram這樣的照片共享應用程序:基本知識。

instagram架構by Dmytro Brovkin由Dmytro Brovkin 如何創建像Instagram這樣的照片共享應用程序&#xff1a;基本知識。 (How to create a photo sharing app like Instagram: the basics.) After two centuries of rapid development, photography has come a long way from b…