Python常用數據結構之collections模塊


Python數據結構常用模塊collections 、heapq、 operator、 itertools

collections

  collections是日常工作中的重點、高頻模塊,常用類型有:

  計數器(Counter)

  雙向隊列(deque)

  默認字典(defaultdict)

  有序字典(OrderedDict)

  可命名元組(namedtuple) 

1. Counter

  Counter作為字典dicit()的一個子類用來進行hashtable計數,將元素進行數量統計,計數后返回一個字典,鍵值為元素,值為元素個數

  常用方法:

most_common(int) 按照元素出現的次數進行從高到低的排序,返回前int個元素的字典
elements 返回經過計算器Counter后的元素,返回的是一個迭代器
update 和set集合的update一樣,對集合進行並集更新
substract 和update類似,只是update是做加法,substract做減法,從另一個集合中減去本集合的元素
iteritems 返回由Counter生成的字典的所有item
iterkeys 返回由Counter生成的字典的所有key
itervalues 返回由Counter生成的字典的所有value

  示例:

#coding=utf-8

from collections import Counter

str = "abcbcaccbbad"
li = ["a","b","c","a","b","b"]
d = {"1":3, "3":2, "17":2}

#Counter獲取各元素的個數,返回字典
print ("Counter(s):", Counter(str))
print ("Counter(li):", Counter(li))
print ("Counter(d):", Counter(d))

#most_common(int)按照元素出現的次數進行從高到低的排序,返回前int個元素的字典
d1 = Counter(str)
print ("d1.most_common(2):",d1.most_common(2))

#elements返回經過計算器Counter后的元素,返回的是一個迭代器
print ("sorted(d1.elements()):", sorted(d1.elements()))
print ('''("".join(d1.elements())):''',"".join(d1.elements()))
#若是字典的話返回value個key
d2 = Counter(d)
print("若是字典的話返回value個key:", sorted(d2.elements()))

#update和set集合的update一樣,對集合進行並集更新
print ("d1.update("sas1"):",d1.update("sas1"))

>>>> Counter(s): Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1})
>>>> Counter(li): Counter({'b': 3, 'a': 2, 'c': 1})
>>>> Counter(d): Counter({'1': 3, '3': 2, '17': 2})
>>>> d1.most_common(2): [('b', 4), ('c', 4)]
>>>> sorted(d1.elements()): ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd']
>>>> ("".join(d1.elements())): aaabbbbccccd
>>>> ['1', '1', '1', '17', '17', '3', '3']

2. deque

  deque屬於高性能的數據結構之一,常用方法如下:

append 隊列右邊添加元素
appendleft 隊列左邊添加元素
clear 清空隊列中的所有元素
count 返回隊列中包含value的個數
extend 隊列右邊擴展,可以是列表、元組或字典,如果是字典則將字典的key加入到deque
extendleft 同extend,在左邊擴展
pop 移除並返回隊列右邊的元素
popleft 移除並返回隊列左邊的元素
remove(value) 移除隊列第一個出現的元素
reverse 隊列的所有元素進行反轉
rotate(n) 對隊列數進行移動

3. defaultdict

  默認字典,字典的一個子類,繼承所有字典的方法,默認字典在進行定義初始化的時候得指定字典值有默認類型

dic = defaultdict(dict)

  dic["k1"].update({"asdsa":"123"}) 

  print (dic)

>>> defaultdict(<class 'dict'>, {'k1': {'asdsa': '123'}})

  注:字典dic在定義的時候就定義好了值為字典類型,雖然現在字典中還沒有鍵值 k1,但仍然可以執行字典的update方法. 這種操作方式在傳統的字典類型中是無法實現的,必須賦值以后才能進行值得更新操作,否則會報錯。

4. OrderedDict

  有序字典也是字典的一個子類

  傳統方法進行字典排序

#定義傳統字典  
dic1 = dict()  
# 按順序添加字典內容  
dic1['a'] = '123'  
dic1['b'] = 'jjj'  
dic1['c'] = '394'  
dic1['d'] = '999'  
print(dic1)    # 結果: {'a': '123', 'c': '394', 'b': 'jjj', 'd': '999'}  
# 排序  
dic1_key_list = []  
for k in dic1.keys():  
    dic1_key_list.append(k)  
dic1_key_list.sort()  
for key in dic1_key_list:  
    print('dic1字典排序結果 %s:%s' %(key,dic1[key]))  

  使用OrderedDict對字典進行排序

#定義有序字典  
dic2 = OrderedDict()  
dic2['a'] = '123'  
dic2['b'] = 'jjj'  
dic2['c'] = 'abc'  
dic2['d'] = '999'  
for k, v in dic2.iteritems():  
    print('有序字典:%s:%s' %(k,v)) 

5. namedtuple

  namedtuple由自己的類工廠namedtuple()進行創建,而不是由表中的元組進行初始化,通過namedtuple創建類的參數包括類名稱和一個包含元素名稱的字符串

  常用方法示例:

#coding=utf-8

from collections import namedtuple

p = namedtuple("person", "name,age,sex")
print (type(p))

zhanglin = p("zhanglin",30,"male")
print(zhanglin)
print(zhanglin.name,zhanglin.age)

 >>> <class 'type'>
 >>> person(name='zhanglin', age=30, sex='male')
 >>> zhanglin 30

  rename參數使用

  使用namedtuple()來創建類的時候,傳遞的成員屬性參數名稱不能非法(不能重復,不能為系統標識符),否則會報錯

try:
    pp = namedtuple("person","name,age,class,sex")
    print(pp._fields)
    lili = pp("lili",20,"aa","male")
except Exception as e:
    print("error",e)

 >>> error Type names and field names cannot be a keyword: 'class'

  輸入錯誤非我們可以控制,namedtuple提供rename=True參數會使系統自動的將錯誤的參數通過“下划線+參數索引”的方式將參數名稱替換

try:
    pp = namedtuple("person","name,age,class,sex",rename=True)
    print(pp._fields)
    lili = pp("lili",20,"aa","male")
except Exception as e:
    print("error",e)

 >>> ('name', 'age', '_2', 'sex')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM