Python:collection模組(內建了一些群集相關的方法和函式)
阿新 • • 發佈:2018-12-20
#!/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的子類 """