国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中的defaultdict模塊和namedtuple模塊的簡單入門指南

2020-02-23 00:28:32
字體:
來源:轉載
供稿:網友

在Python中有一些內置的數據類型,比如int, str, list, tuple, dict等。Python的collections模塊在這些內置數據類型的基礎上,提供了幾個額外的數據類型:namedtuple, defaultdict, deque, Counter, OrderedDict等,其中defaultdict和namedtuple是兩個很實用的擴展類型。defaultdict繼承自dict,namedtuple繼承自tuple。
一、defaultdict

 1. 簡介

在使用Python原生的數據結構dict的時候,如果用d[key]這樣的方式訪問,當指定的key不存在時,是會拋出KeyError異常的。但是,如果使用defaultdict,只要你傳入一個默認的工廠方法,那么請求一個不存在的key時, 便會調用這個工廠方法使用其結果來作為這個key的默認值。

defaultdict在使用的時候需要傳一個工廠函數(function_factory),defaultdict(function_factory)會構建一個類似dict的對象,該對象具有默認值,默認值通過調用工廠函數生成。

2. 示例

下面給一個defaultdict的使用示例:
 

In [1]: from collections import defaultdict In [2]: s = [('xiaoming', 99), ('wu', 69), ('zhangsan', 80), ('lisi', 96), ('wu', 100), ('yuan', 98), ('xiaoming', 89)] In [3]: d = defaultdict(list) In [4]: for k, v in s:  ...:   d[k].append(v)  ...:   In [5]: dOut[5]: defaultdict(<type 'list'>, {'lisi': [96], 'xiaoming': [99, 89], 'yuan': [98], 'zhangsan': [80], 'wu': [69, 100]}) In [6]: for k, v in d.items():  ...:   print '%s: %s' % (k, v)  ...:  lisi: [96]xiaoming: [99, 89]yuan: [98]zhangsan: [80]wu: [69, 100]

對Python比較熟悉的同學可以發現defaultdict(list)的用法和dict.setdefault(key, [])比較類似,上述代碼使用setdefault實現如下:
 

s = [('xiaoming', 99), ('wu', 69), ('zhangsan', 80), ('lisi', 96), ('wu', 100), ('yuan', 98), ('xiaoming', 89)]d = {} for k, v in s:  d.setdefault(k, []).append(v)

3. 原理

從以上的例子中,我們可以基本了defaultdict的用法,下面我們可以通過help(defaultdict)了解一下defaultdict的原理。通過Python console打印出的help信息來看,我們可以發現defaultdict具有默認值主要是通過__missing__方法實現的,如果工廠函數不為None,則通過工廠方法返回默認值,具體如下:
 

def __missing__(self, key):  # Called by __getitem__ for missing key  if self.default_factory is None:    raise KeyError((key,))  self[key] = value = self.default_factory()  return value

從上面的說明中,我們可以發現一下幾個需要注意的地方:

a). __missing__方法是在調用__getitem__方法發現KEY不存在時才調用的,所以,defaultdict也只會在使用d[key]或者d.__getitem__(key)的時候才會生成默認值;如果使用d.get(key)是不會返回默認值的,會出現KeyError;

b). defaultdict主要是通過__missing__方法實現,所以,我們也可以通過實現該方法來生成自己的defaultdict,代碼入下:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 颍上县| 伊宁市| 盐山县| 乳山市| 读书| 海宁市| 南漳县| 钟祥市| 奇台县| 来宾市| 浮梁县| 浦城县| 安乡县| 拉萨市| 宁武县| 买车| 沙湾县| 平江县| 泗水县| 涟水县| 河津市| 大英县| 于都县| 乐东| 安远县| 高要市| 平武县| 铁力市| 平远县| 荔浦县| 兰州市| 大洼县| 同江市| 克山县| 桐庐县| 土默特右旗| 云霄县| 太湖县| 犍为县| 阳朔县| 防城港市|