摘要:的模塊在這些內置數據類型的基礎上,提供了幾個額外的數據類型等,其中和是兩個很實用的擴展類型。繼承自,繼承自。這種方式比容易理解多了,可以很清楚的知道每個值代表的含義。
在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]: d Out[5]: defaultdict(, {"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
從上面的說明中,我們可以發現一下幾個需要注意的地方:
missing方法是在調用getitem方法發現KEY不存在時才調用的,所以,defaultdict也只會在使用d[key]或者d.getitem(key)的時候才會生成默認值;如果使用d.get(key)是不會返回默認值的,會出現KeyError;
defaultdict主要是通過missing方法實現,所以,我們也可以通過實現該方法來生成自己的defaultdict,代碼入下
In [1]: class MyDefaultDict(dict): ...: def __missing__(self, key): ...: self[key] = "default" ...: return "default" ...: In [2]: my_default_dict = MyDefaultDict() In [3]: my_default_dict Out[3]: {} In [4]: print my_default_dict["test"] default In [5]: my_default_dict Out[5]: {"test": "default"}4. 版本
defaultdict是在Python 2.5之后才加入的功能,在舊版本的Python中是不支持這個功能的,不過,知道了它的原理,我們可以自己實現一個defaultdict。
# http://code.activestate.com/recipes/523034/ try: from collections import defaultdict except: class defaultdict(dict): def __init__(self, default_factory=None, *a, **kw): if (default_factory is not None and not hasattr(default_factory, "__call__")): raise TypeError("first argument must be callable") dict.__init__(self, *a, **kw) self.default_factory = default_factory def __getitem__(self, key): try: return dict.__getitem__(self, key) except KeyError: return self.__missing__(key) def __missing__(self, key): if self.default_factory is None: raise KeyError(key) self[key] = value = self.default_factory() return value def __reduce__(self): if self.default_factory is None: args = tuple() else: args = self.default_factory, return type(self), args, None, None, self.items() def copy(self): return self.__copy__() def __copy__(self): return type(self)(self.default_factory, self) def __deepcopy__(self, memo): import copy return type(self)(self.default_factory, copy.deepcopy(self.items())) def __repr__(self): return "defaultdict(%s, %s)" % (self.default_factory, dict.__repr__(self))二、namedtuple
namedtuple主要用來產生可以使用名稱來訪問元素的數據對象,通常用來增強代碼的可讀性,在訪問一些tuple類型的數據時尤其好用。其實,在大部分時候你應該使用namedtuple替代tuple,這樣可以讓你的代碼更容易讀懂,更加pythonic。舉個例子:
from collections import namedtuple # 變量名和namedtuple中的第一個參數一般保持一致,但也可以不一樣 Student = namedtuple("Student", "id name score") # 或者 Student = namedtuple("Student", ["id", "name", "score"]) students = [(1, "Wu", 90), (2, "Xing", 89), (3, "Yuan", 98), (4, "Wang", 95)] for s in students: stu = Student._make(s) print stu # Output: # Student(id=1, name="Wu", score=90) # Student(id=2, name="Xing", score=89) # Student(id=3, name="Yuan", score=98) # Student(id=4, name="Wang", score=95)
在上面的例子中,Student就是一個namedtuple,它和tuple的使用方法一樣,可以通過index直接取,而且是只讀的。這種方式比tuple容易理解多了,可以很清楚的知道每個值代表的含義。
Over!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37467.html
摘要:常用模塊模塊在內置數據類型的基礎上,模塊還提供了幾個額外的數據類型和等。有如下值集合,將所有大于的值保存至字典的第一個中,將小于的值保存至第二個的值中。如果希望不存在時,返回一個默認值,就可以用模塊常用方法線程推遲指定的時間運行。 常用模塊 collections模塊 在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型...
摘要:原生的也可以從頭部添加和取出對象就像這樣但是值得注意的是,對象的這兩種用法的時間復雜度是,也就是說隨著元素數量的增加耗時呈線性上升。 基本介紹 Python擁有一些內置的數據類型,比如str, int, list, tuple, dict等, collections模塊在這些內置數據類型的基礎上,提供了幾個額外的數據類型: namedtuple(): 生成可以使用名字來訪問元素內容的...
摘要:這里提示一下,有些函數對隊列進行操作,但返回值是,比如反轉隊列,將隊列中元素向右移位,尾部的元素移到頭部。比如字典中的鍵映射多個值輸出結果如下三用途創建命名字段的元組。四用途統計可哈希的對象。 本文將詳細講解collections模塊中的所有類,和每個類中的方法,從源碼和性能的角度剖析。 一個模塊主要用來干嘛,有哪些類可以使用,看__init__.py就知道 This module i...
閱讀 2782·2021-10-11 11:08
閱讀 1498·2021-09-30 09:48
閱讀 1059·2021-09-22 15:29
閱讀 1044·2019-08-30 15:54
閱讀 986·2019-08-29 15:19
閱讀 537·2019-08-29 13:12
閱讀 3172·2019-08-26 13:53
閱讀 972·2019-08-26 13:28