1. 程式人生 > 其它 >python collections模組

python collections模組

技術標籤:# 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版本後引入。

python原生的dict結構,如果使用d[key]的方式訪問,需要先判斷key是否存在。如果key在字典中不存在,會丟擲一個KeyError的異常。
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:

# 一個無盡迴圈的跑馬燈
------------->-------