import collections
'''
collections.ChainMap(dict1, dict2,...)
將多個字典鏈在一起,并不是將多個字典真正的合并。如果key重復,就以位置最靠前的為準
'''
person1 = {'name1': '張三', 'age': 18, 'height': 1.8}
person2 = {'name2': '李四', 'age2': 19, 'height': 1.7}
person3 = {'name3': '王五', 'age': 20, 'height3': 1.75}
res = collections.ChainMap(person1, person2, person3)
print(res)
# ChainMap({'name1': '張三', 'age': 18, 'height': 1.8}, {'name2': '李四', 'age2': 19, 'height': 1.7}, {'name3': '王五', 'age': 20, 'height3': 1.75})
print(res['name1']) # 張三
print(res['name2']) # 李四
print(res['name3']) # 王五
print(res['age']) # 18
print(res['height']) # 1.8
'''
collections.Counter(iterable)
用來統(tǒng)計容器里面元素出現(xiàn)的次數(shù),返回值相當于一個字典
對于 Counter 對象還有一些很常用的操作,比如把 Counter 對象轉換成 set(集合)、list(列表)、dict(字典)等,
程序還可對 Counter 執(zhí)行加、減、交、并運算,對 Counter 進行求正、求負運算等。對 Counter 執(zhí)行各種運算的含義如下:
加:將兩個 Counter 對象中各 key 出現(xiàn)的次數(shù)相加,且只保留出現(xiàn)次數(shù)為正的元素。
減:將兩個 Counter 對象中各 key 出現(xiàn)的次數(shù)相喊,且只保留出現(xiàn)次數(shù)為正的元素。
交:取兩個 Counter 對象中都出現(xiàn)的 key 且各 key 對應的次數(shù)的最小數(shù)。
并:取兩個 Counter 對象中各 key 對應的出現(xiàn)次數(shù)的最大數(shù)。
求正:只保留 Counter 對象中出現(xiàn)次數(shù)為 0 或正數(shù)的 key-value 對。
求負:只保留 Counter 對象中出現(xiàn)次數(shù)為負數(shù)的 key-value 對,并將出現(xiàn)次數(shù)改為正數(shù)。
'''
c = collections.Counter('hfsefseh')
print(c)
# Counter({'h': 2, 'f': 2, 's': 2, 'e': 2})
print(c.most_common(2)) # 出現(xiàn)頻率最高的前兩位
# [('h', 2), ('f', 2)]
print(list(c.elements())) # 查看出現(xiàn)在統(tǒng)計表中的元素的排序
c1 = collections.Counter([1,2,3,4,3,1,2])
print(c1) # Counter({1: 2, 2: 2, 3: 2, 4: 1})
c2 = collections.Counter({'python':5, 'go':4})
print(c2) # Counter({'python': 5, 'go': 4})
c3 = collections.Counter(python=5, go=4)
print(c3) # Counter({'python': 5, 'go': 4})
c3.subtract(['python', 'python', 'go']) # 將Counter c3依次減去列表里面出現(xiàn)的次數(shù)
print(c3) # Counter({'python': 3, 'go': 3})
'''
collections.defaultdict()
defaultdict 是 dict 的子類,因此 defaultdict 也可被當成 dict 來使用,dict 支持的功能,defaultdict 基本都支持。
但它與 dict 最大的區(qū)別在于,如果程序試圖根據(jù)不存在的 key 采訪問 dict 中對應的 value,則會引發(fā) KeyError 異常;
而 defaultdict 則可以提供一個 default_factory 屬性,該屬性所指定的函數(shù)負責為不存在的 key 來生成 value。
'''
my_defaultdict = collections.defaultdict(int)
print(my_defaultdict['a']) # 我們并沒有給my_defaultdict設定'a'這個鍵,但是我們取訪問并沒有引發(fā)KeyError異常
s = [('Python', 1), ('Swift', 2), ('Python', 3), ('Swift', 4), ('Python', 9)]
d = {}
for k, v in s:
# setdefault()方法用于獲取指定key對應的value.
# 如果該key不存在,則先將該key對應的value設置為默認值:[]
d.setdefault(k, []).append(v)
print(d.items())
'''
collections.namedtuple()
namedtuple() 是一個工廠函數(shù),使用該函數(shù)可以創(chuàng)建一個 tuple 類的子類,該子類可以為 tuple 的每個元素都指定宇段名,
這樣程序就可以根據(jù)字段名來訪問 namedtuple 的各元素了。當然,如果有需要,程序依然可以根據(jù)索引來訪問namedtuple 的各元素。
namedtuple 是輕量級的,性能很好,其并不比普通 tuple 需要更多的內存
namedtuple(typename, field_names, *, verbose=False, rename=False, module=None)
typename:該參數(shù)指定所創(chuàng)建的 tuple 子類的類名,相當于用戶定義了一個新類。
field_names:該參數(shù)是一個字符串序列,如 ['x','y']。此外,field_names 也可直接使用單個字符串代表所有字段名,多個字段名用空格、逗號隔開,
如 'x y' 或 'x,y'。任何有效的 Python 標識符都可作為字段名(不能以下畫線開頭)。有效的標識符可由字母、數(shù)字、下畫線組成,但不能以數(shù)字、
下面線開頭,也不能是關鍵字(如 return、global、pass、raise 等)。
rename:如果將該參數(shù)設為 True,那么無效的字段名將會被自動替換為位置名。例如指定 ['abc','def','ghi','abc'],
它將會被替換為 ['abc', '_1','ghi','_3'],這是因為 def 字段名是關鍵字,而 abc 字段名重復了。
verbose:如果該參數(shù)被設為 True,那么當該子類被創(chuàng)建之后,該類定義就會被立即打印出來。
module:如果設置了該參數(shù),那么該類將位于該模塊下,因此該自定義類的 __module__ 屬性將被設為該參數(shù)值
'''
Point = collections.namedtuple('Point', 'x y')
p1 = Point(10, 20)
print(p1.x) # 命名元組可以以屬性的方式訪問
print(p1.y)
print(p1[0]) # 命名元組也可以以下標的形式訪問
print(p1[1])
'''
命名元組的其他方法:
_make(iterable):類方法。該方法用于根據(jù)序列或可迭代對象創(chuàng)建命名元組對象。
_asdict():將當前命名元組對象轉換為 OrderedDict 字典。
_replace(**kwargs):替換命名元組中一個或多個字段的值。
_source:該屬性返回定義該命名元組的源代碼。
_fields:該屬性返回該命名元組中所有字段名組成的元組。
'''
my_data = ['name', 'age']
p2 = Point._make(my_data)
print(p2.x) # name
print(p2.y) # age
print(p2._asdict()) # OrderedDict([('x', 'name'), ('y', 'age')])
print(p2._replace(y='height')) # Point(x='name', y='height')
print(p2._fields) # ('x', 'y')
'''
collections.OrderDict
OrderedDict 也是 dict 的子類,其最大特征是,它可以“維護”添加 key-value 對的順序。簡單來說,
就是先添加的 key-value 對排在前面,后添加的 key-value 對排在后面。
'''
od = collections.OrderedDict(a=1, b=2, c=3)
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od['name'] = '張三'
od['age'] = 16
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('name', '張三'), ('age', 16)])
'''
popitem(last=True):默認彈出并返回最右邊(最后加入)的 key-value 對;如果將 last 參數(shù)設為 False,
則彈出并返回最左邊(最先加入)的 key-value 對。
move_to_end(key, last=True):默認將指定的 key-value 對移動到最右邊(最后加入);如果將 last 改為 False,
則將指定的 key-value 對移動到最左邊(最先加入)。
'''
d = collections.OrderedDict().fromkeys('abcdef')
print(d)
d.move_to_end('b', last=True)
print(d)
d.popitem(last=True)
print(d)
'''
collections.deque---雙端隊列
append 和 appendleft:在 deque 的右邊或左邊添加元素,也就是默認在隊列尾添加元素。
pop 和 popleft:在 deque 的右邊或左邊彈出元素,也就是默認在隊列尾彈出元素。
extend 和 extendleft:在 deque 的右邊或左邊添加多個元素,也就是默認在隊列尾添加多個元素。
deque 中的 clear() 方法用于清空隊列:insert() 方法則是線性表的方法,用于在指定位置插入元素。
'''
'''
將deque當做棧使用,只能在一端添加或刪除元素
棧的特點的是先進先后出
'''
stack = collections.deque(['張三', '李四', '王五'])
print(stack) # deque(['張三', '李四', '王五'])
stack.append('趙六')
print(stack) # deque(['張三', '李四', '王五', '趙六'])
res = stack.pop()
print(res) # 趙六
print(stack) # deque(['張三', '李四', '王五'])
'''
將deque當做隊列使用,只能在一端添加元素,在另一端刪除元素
隊列的特點是先進先出
'''
q = collections.deque(['張三', '李四', '王五'])
print(q) # deque(['張三', '李四', '王五'])
q.appendleft('趙六')
print(q) # deque(['趙六', '張三', '李四', '王五'])
res = q.pop()
print(res) # 王五
print(q) # deque(['趙六', '張三', '李四'])
if __name__ == '__main__':
pass
python模塊---collections
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關閱讀更多精彩內容
- 我們都知道,Python擁有一些內置的數(shù)據(jù)類型,比如str,int,list,tuple,dict等,collec...
- 基本介紹 Python擁有一些內置的數(shù)據(jù)類型,比如str, int, list, tuple, dict等, co...
- Python 作為一個“內置電池”的編程語言,標準庫里面擁有非常多好用的模塊。比如今天想給大家 介紹的 colle...
- 這是介紹collections模塊的第二部分內容。 deque counter ChainMap 1 deque ...