python collections模組
阿新 • • 發佈:2021-01-09
技術標籤:# Python常用模組
文章來源:https://blog.csdn.net/bitcarmanlee/article/details/52735415
目錄
1.Counter類
Counter類是hashtable物件的計數,是dict的子類,從2.7以後的版本加入。
計數器是我們常用的一個功能,collections中的Counter類就提供了此功能。
>>> from collections import *
>>> a = Counter()
>>> b = Counter("aabbcccd")
>>> c = Counter({"a":10,"b":20})
>>> d = Counter(a=10,b=20)
>>> b["a"]
2
>>> c.most_common()
[('b', 20), ('a', 10)]
2.defaultdict類
defaultdict使用工廠函式建立字典,使用的時候不用考慮缺失的key。從2.5版本後引入。
defaultdict就是為解決這個痛點而生的。只要傳入一個預設的工廠方法,如果用d[key]的方式訪問字典而key不存在,會呼叫這個工廠方法使用其結果來作為這個key的預設值。
#!/usr/bin/env python
#coding:utf-8
from collections import *
def test_defaultdict():
members = [
['male', 'John'],
['male' , 'Jack'],
['female', 'Lily'],
['male', 'Pony'],
['female', 'Lucy']
]
result_dic = defaultdict(list)
for sex,name in members:
result_dic[sex].append(name)
for k,v in result_dic.items():
print k,"\t",v
test_defaultdict()
最後的輸出為:
male ['John', 'Jack', 'Pony']
female ['Lily', 'Lucy']
3.OrderedDict類
排序字典,是字典的子類。從2.7版本後引入。
在python中,dict,set等資料結構的key是hash無序的。有時候,我們需要得到排序的字典。collections中的OrderedDict類即可滿足我們的上述需求。
#!/usr/bin/env python
#coding:utf-8
from collections import *
def test_orderdict():
raw_dic = {"watermelon":4,"grape":3,"apple":1,"mango":2}
ret_dic_by_key = OrderedDict(sorted(raw_dic.items(),key = lambda item:item[0]))
ret_dic_by_value = OrderedDict(sorted(raw_dic.items(),key = lambda item:item[1]))
ret_dic_by_keylen = OrderedDict(sorted(raw_dic.items(),key = lambda item:len(item[0])))
print "ret_dic_by_key is: "
for k,v in ret_dic_by_key.items():
print k,"\t",v
print "ret_dic_by_value is: "
for k,v in ret_dic_by_value.items():
print k,"\t",v
print "ret_dic_by_keylen is: "
for k,v in ret_dic_by_keylen.items():
print k,"\t",v
test_orderdict()
將程式碼run起來以後:
ret_dic_by_key is:
apple 1
grape 3
mango 2
watermelon 4
ret_dic_by_value is:
apple 1
mango 2
grape 3
watermelon 4
ret_dic_by_keylen is:
grape 3
mango 2
apple 1
watermelon 4
4.namedtuple
namedtuple,命名元組,是一個工廠函式。從2.6版本後引入。
namedtuple主要用來產生可以使用名稱來訪問元素的資料物件,通常用來增強程式碼的可讀性, 在訪問一些tuple型別的資料時尤其好用。
#!/usr/bin/env python
#coding:utf-8
from collections import *
def test_namedtuple():
Point = namedtuple('Point','x y')
location = [10,20]
p = Point._make(location)
print p
print "p.x is: ",p.x
print "p.y is: ",p.y
test_namedtuple()
將程式碼run起來以後:
Point(x=10, y=20)
p.x is: 10
p.y is: 20
5.deque
deque,雙端佇列,從2.4版本後引入。
雙端佇列(deque)是一種支援向兩端高效地插入資料、支援隨機訪問的容器。它最大的好處就是實現了從佇列 頭部快速增加和取出物件: .popleft(), .appendleft() 。
從piglei同志的部落格中摘取一個deque的例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
下面這個是一個有趣的例子,主要使用了deque的rotate方法來實現了一個無限迴圈
的載入動畫
"""
import sys
import time
from collections import deque
fancy_loading = deque('>--------------------')
while True:
print '\r%s' % ''.join(fancy_loading),
fancy_loading.rotate(1)
sys.stdout.flush()
time.sleep(0.08)
# Result:
# 一個無盡迴圈的跑馬燈
------------->-------