Python的重要模块:collections (namedtuple、defaultdict、deque、Counter、OrderedDict、ChainMap)
collections 模塊作用
包含雙端隊列 deque、默認字典 defaultdict、命名元組 namedtuple、計數(shù)器 Counter、Ordereddict 和 ChainMap 等重要模塊。他們是增強版的高級數(shù)據(jù)結(jié)構(gòu)。
1. tuple 功能
為了講解 namedtuple,所以先介紹 tuple 的功能,以便分析兩者異同。
tuple 是一個不可變的元組,可迭代對象(內(nèi)部實現(xiàn)了__iter__,或者__getitem__ 方法),可以進行拆包、tuple 的不可變性不是絕對的。
tuple 和 list 相比的優(yōu)勢
immutable 的重要性:Python的性能優(yōu)化(tuple作為常量在編譯時確定,加速腳本)、線程安全(線程無法對其進行修改)、可以作為 dict 的 key 值(可以進行哈希,而 list 不能)、 拆包特性。
2. namedtuple 功能
先來看簡單的應(yīng)用例子:
from collections import namedtupleUser = namedtuple('User', ['name', 'age', 'height', 'edu']) # 這里面相當于創(chuàng)建了一個簡單的類 user = User(name='sqz', age=23, height=175) user.edu = 'master' # 方便增加新的屬性 print(user.name, user.age, user.height) # Output: sqz 23 175# 另一種賦值方式 user_tuple = ('sqz', 23, 175) user = User(*user_tuple, 'master') print(user.name, user.age, user.height, user.edu) # Output: sqz 23 175 masteruser_dict = { "name":'sqz', "age":23, "height":175 } user = User(**user_dict , edu = 'master')# 使用內(nèi)置函數(shù)_make()賦值,必須保持參數(shù)個數(shù)一致 user_dict = { "name":'sqz', "age":23, "height":175 "edu" : "master" } user._make(user_dict)# 使用內(nèi)置函數(shù)_asdict()將namedtuple轉(zhuǎn)化為一個OrderedDict user_info_dict = user._asdict()特點:
3. defaultdict 功能
defaultdict 是通過C語言實現(xiàn)的,性能特別的高。
defaultdict 的第一大作用:為新加入鍵值 key 分配默認的 value 值。實例如下:
defaultdict 的第二大作用:設(shè)計嵌套的字典結(jié)構(gòu),示例如下:
from collections import defaultdictdef gen_default(): # 可調(diào)用結(jié)構(gòu)return {"name":"""nums":0} default_dict = defaultdict(gen_default) # 參數(shù)傳入可調(diào)用結(jié)構(gòu) default_dict['group1'] # 嵌套字典,group1的 key值為'name','nums'4. deque 功能
C語言實現(xiàn),效率高。雙端隊列,使用可迭代對象初始化,如 list、tuple、dict。代碼示例:
from collections import dequeuser_deque = deque(['sqz1', 'sqz2', 'sqz3']) user_deque.appendleft('sqz8') # ['sqz8', 'sqz1', 'sqz2', 'sqz3'] 左側(cè)添加數(shù)據(jù) user_deque.clear() # 清空數(shù)據(jù)copy() 函數(shù)實現(xiàn)淺拷貝:
from collections import dequeuser_deque = deque(['sqz1', 'sqz2', ['sqz3']]) user_copy = user_deque.copy() # 不可變元素直接復(fù)制,可變元素直接指向(如 list)。 user_copy[0] = 'sqz100' user_copy[2].append('sqzhaha') print(user_deque) # deque(['sqz1', 'sqz2', ['sqz3', 'sqzhaha']]) print(user_copy) # deque(['sqz100', 'sqz2', ['sqz3', 'sqzhaha']])Python 中同樣提供了深拷貝的包:
import copy from collections import dequeuser_deque = deque(['sqz1', 'sqz2', ['sqz3']]) user_copy = copy.deepcopy(user_deque) # 深拷貝 user_copy[2].append('sqzhaha')print(user_deque) # deque(['sqz1', 'sqz2', ['sqz3']]) print(user_copy) # deque(['sqz1', 'sqz2', ['sqz3', 'sqzhaha']])extend() 函數(shù)將兩個 deque 合并為一個:
from collections import dequeuser_deque = deque(['sqz1', 'sqz2', ['sqz3']]) user_deque1 = deque(['haha'])user_deque.extend(user_deque1) # 直接在 user_deque 上進行擴充,沒有返回值deque 是線程安全的,而 list 不是。
5. Counter
dict 的子類,用于統(tǒng)計元素數(shù)目,示例如下:
from collections import Counterusers = ['sqz1', 'sqz2', 'sqz4', 'sqz1', 'sqz2'] user_counter = Counter(users) print(user_counter) # Counter({'sqz1':2, 'sqz2':2, 'sqz4':1}) 排序好的,次數(shù)最多的在前面str_count = Counter('aanncddds') str_count.update("bddc") # 更新統(tǒng)計,增加統(tǒng)計數(shù)據(jù)str_count.most_common(2) # 取出前兩個出現(xiàn)次數(shù)最多的元素6. OrderedDict 功能
排好序的字典。繼承自 dict,dict有的功能它都有。保持字典中元素的添加順序。在Python3中,dict 和 OrderedDict 都是有序的。而在Python2下, dict 無序,而OrderedDict有序。
from collections import OrderedDictuser_dict = OrderedDict() user_dict['b'] = 'sqz2' user_dict['a'] = 'sqz3' user_dict['c'] = 'sqz1' print(user_dict) # Output: {'b':'sqz2', 'a':'sqz3', 'c':'sqz1'}OrderedDict 中一些重要函數(shù):popitem()、move_to_end()
print(user_dict.popitem()) # ('c', 'sqz1') print(user_dict.pop()) # 會報錯,pop() 函數(shù)中應(yīng)傳遞 key值。print(user_dict.move_to_end('b')) # 輸出Noneprint(user_dict) # 輸出:{'a':'sqz3', 'c':'sqz1', 'b':'sqz2'}7. ChainMap 功能
當想遍歷多個可迭代對象時,將兩個可迭代對象連接起來。在兩個對象上加上迭代器,指向性的,并沒有賦值結(jié)構(gòu)和值。如下例:
from collections import ChainMapuser_dict1 = {'a':'sqz1', 'b':'sqz2'} user_dict2 = {'c':'sqz2', 'd':'sqz3'} new_dict = ChainMap(user_dict1, user_dict2)for key, value in new_dict.items():print(key, value) # Output: # a sqz1 # b sqz2 # c sqz2 # d sqz3當兩個地點中有重復(fù) key值時,只能訪問出現(xiàn)第一次的鍵值對。
一些重要函數(shù):new_child()、屬性:maps、
總結(jié)
以上是生活随笔為你收集整理的Python的重要模块:collections (namedtuple、defaultdict、deque、Counter、OrderedDict、ChainMap)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧盟仍在调查苹果 Apple Pay 反
- 下一篇: 2020.8.26广联达笔试第二题——魔