1. 程式人生 > >Python:collection模組(內建了一些群集相關的方法和函式)

Python:collection模組(內建了一些群集相關的方法和函式)

#!/usr/bin/env python
# coding:UTF-8


"""
@version: python3.x
@author:曹新健
@contact: [email protected]
@software: PyCharm
@file: collection模組(內建了一些群集相關的方法和函式).py
@time: 2018/11/8 15:06
"""
"""
除了內建的叢集外,python標準連結庫中還包含了collections模組,包含了一些處理群集的函式與方法,可以
滿足一些群集處理的高階需求
一、deque類:
    1、實現先進後出的堆疊結構(Stack),可以使用列表,通過append()和pop()方法實現。
    2、對於佇列(Queue)或者雙向佇列,使用列表,涉及列表的移動,效率並不好。可以使用collections模組的
       deque類。
    3、deque類實現了append()、appendleft()、pop()、popleft()等方法,所以兩端插入的效率等同於Q(1)數量級
       的效率。同時還有rotate(n)方法,來實現環形佇列,n代表一次轉幾個元素。
    程式碼示例:
    import collections
    queue = collections.deque([1,2,3])
    queue.appendleft(0)
    queue.appendleft(-1)
    print(queue)  #列印deque([-1, 0, 1, 2, 3])
    queue.append(4)
    queue.append(5)
    print(queue)  #列印deque([-1, 0, 1, 2, 3, 4, 5])
    queue.popleft()
    print(queue)  #列印deque([0, 1, 2, 3, 4, 5])
    queue.pop()
    print(queue)  #列印deque([0, 1, 2, 3, 4])
    queue.rotate(1)
    print(queue)  #列印deque([4, 0, 1, 2, 3])
二、namatuple()函式
    1、元組的元素沒有名稱,只能通過索引來獲取各個元素,非常不便。如果想有個簡單類,以便建立的例項擁有
       欄位名,可以使用collections模組的namatuple()函式
    2、namatuple()的第一個引數是想要建立的型別名稱,第二個引數是欄位名,它返回元組的子類。故繼承了元組
       的所有方法。
    3、由於namatuple()返回的實際上就是一個類,因此可以直接使用繼承語句建立一個類,以便自定義一些方法。
    4、namatuple()返回類,除了繼承自元組的方法外,還額外定義了一些方法,比如:_make(iterable)可以建立
       例項;_asdict()方法返回欄位名和值;_replace方法制定欄位和值會建立新例項;_fields可以獲取全部字
       段名等。
    程式碼示例:
    from collections import namedtuple
    Point = namedtuple("Point",["x","y","z"])
    p1 = Point(1,2,3)
    print(p1)   #列印Point(x=1, y=2, z=3)
    print(p1.x,p1[0])   #列印1 1
    lt = [4,5,6]
    p2 = Point._make(lt)
    print(p2)   #列印Point(x=4, y=5, z=6)
    print(p1._asdict())   #列印OrderedDict([('x', 1), ('y', 2), ('z', 3)])
    print(p1._asdict().get("x"))   #列印1
    p3 = p1._replace(z=80)
    print(p1)   #列印Point(x=1, y=2, z=3)
    print(p3)   #列印Point(x=1, y=2, z=80)
    print(Point._fields)   #列印('x', 'y', 'z')

    class Point1(namedtuple("Point",["x","y","z"])):
        def xyz(self):
            return self.x * self.y * self.z

    p5 = Point1(6,7,8)
    print(p5.xyz())   #列印336
三、OrderedDict類:
    建立字典時,如果想保有最初鍵值加入的順序,就可以使用collections模組的OrderedDict類
    程式碼示例:
    from collections import OrderedDict
    from operator import itemgetter
    lt = [("A",90),("B",80),("C",70)]
    od = OrderedDict(lt)
    print(od)   #列印OrderedDict([('A', 90), ('B', 80), ('C', 70)])
    print(od["A"])  #列印90

    dict = {"A":90,"C":70,"B":80}
    #按鍵排序
    keyod = OrderedDict(sorted(dict.items(),key=itemgetter(0)))
    print(keyod)    #列印OrderedDict([('A', 90), ('B', 80), ('C', 70)])
    #按值排序
    valueod = OrderedDict(sorted(dict.items(),key=itemgetter(1)))
    print(valueod)    #列印OrderedDict([('C', 70), ('B', 80), ('A', 90)])
四、defaultdict類
    defaultdict類接受一個函式,它建立的例項在指定鍵不存在時,就使用指定的函式來產生,並直接設定成鍵的
    對應值,比如list生成空列表[],int生成0。
    程式碼示例:
    from collections import defaultdict
    mydict = defaultdict(list)
    print(mydict["x"])  #列印[]
    mydict["x"].append(5)
    mydict["x"].append(6)
    print(mydict["x"])  #列印[5, 6]

    mydict1 = defaultdict(int)
    print(mydict1["x"]) #列印0
    mydict1["x"] += 1
    print(mydict1["x"]) #列印1
五、Counter類,返回字典的子類,具有字典的所有方法。例項的elements()方法會返回所有元素,包括重複的
    程式碼示例:
    from collections import Counter
    c = Counter("cxj is a good tester!")
    print(c)    #列印Counter({' ': 4, 's': 2, 'o': 2, 't': 2, 'e': 2, 'c': 1, 'x': 1, 'j': 1, 'i': 1, 'a': 1, 'g': 1, 'd': 1, 'r': 1, '!': 1})
    print(c["o"])   #列印2
    print(list(c.elements()))   #列印['c', 'x', 'j', ' ', ' ', ' ', ' ', 'i', 's', 's', 'a', 'g', 'o', 'o', 'd', 't', 't', 'e', 'e', 'r', '!']

    dict = {"A":3,"C":4,"B":1}
    c = Counter(dict)
    print(list(c.elements()))   #列印['A', 'A', 'A', 'C', 'C', 'C', 'C', 'B']

    c["B"] = 5
    print(c)    #列印Counter({'B': 5, 'C': 4, 'A': 3}
六、如果想基於字串、列表、字典自定義一些方法,可以繼承collections模組的UserString、UserList、
    UserDict,他們分別是Sequences、MutableSequences、MutableMapping的子類
"""