1. 程式人生 > >python模塊之collections random

python模塊之collections random

print class counter dict default 列表 通過 ui5 例子

collections

在內置數據類型(list, dict, tuple, set)的基礎上,collections提供了幾個額外的數據類型: Counter, deque, Orderdict, defultdict, namedtuple等

1. namedtuple: 生成可以通過名字訪問的元組,類似之前的結構化時間

2. deque: 雙向隊列

3. Counter: 計數器

4. OrderDict: 有序字典

5. defaultdict: 帶有默認值的字典

nametuple

我們要描述一個長方體,就可以用namedtuple

1 from collections import
namedtuple 2 3 cube = namedtuple("cube", ["length", "width", "height"]) 4 c1 = cube(5, 4, 3) 5 print(c1) # cube(length=5, width=4, height=3) 6 print(c1.length) # 5 7 print(c1.height) # 3

deque

deque是為了高效實現插入和刪除操作的雙向列表,適合用於隊列和棧,deque類似於列表,也有append, pop等方法

from collections import deque
q = deque(["
a", "b", "c"]) print(q) # deque([‘a‘, ‘b‘, ‘c‘]) # 添加 q.append("d") # 默認從右邊添加 print(q) # deque([‘a‘, ‘b‘, ‘c‘, ‘d‘]) q.appendleft("e") print(q) # deque([‘e‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘]) # 刪除 q.pop() # 默認從右邊刪,不能指定元素刪 print(q) # deque([‘e‘, ‘a‘, ‘b‘, ‘c‘]) q.popleft() # 默認從左邊刪 print(q) # deque([‘a‘, ‘b‘, ‘c‘])
# q.pop("b") # TypeError: pop() takes no arguments (1 given) print(q.count("a")) # 1 q.remove("b") # 指定元素刪 print(q) # deque([‘a‘, ‘c‘])

OrderDict

使用dict時,Key是無序的。在對dict做叠代時,我們無法確定Key的順序。如果要保持Key的順序,可以用OrderDict,不過python3.6版本以後字典已經是有序的了,所以這個已經用處不大了。註意這裏的key有序是指key按照創建字典或插入值的順序來排

from collections import OrderedDict
od = OrderedDict()
od[1] = "a"
od[2] = "b"
od[3] = "c"
print(od)    # OrderedDict([(1, ‘a‘), (2, ‘b‘), (3, ‘c‘)])

defaultdict

來看一個例子:有如下值集合 [11,22,33,44,55,66,77,88,99,90...],將所有大於 66 的值保存至字典的第一個key中,將小於 66 的值保存至第二個key的值中。

原生字典解決辦法

技術分享圖片
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
dic = dict()
for i in l1:
    if i > 66:
        if "k1" not in dic:
            dic["k1"] = []
        dic["k1"].append(i)
    elif i < 66:
        if "k2" not in dic:
            dic["k2"] = []
        dic["k2"].append(i)
print(dic)    # {‘k2‘: [11, 22, 33, 44, 55], ‘k1‘: [77, 88, 99, 90]}
View Code

defaultdict解決辦法

技術分享圖片
from collections import defaultdict
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
dd = defaultdict(k1=[], k2=[])
# print(dd)    # defaultdict(None, {‘k1‘: [], ‘k2‘: []})
for i in l1:
    if i > 66:
        dd["k1"].append(i)
    elif i < 66:
        dd["k2"].append(i)
print(dd)    # defaultdict(None, {‘k1‘: [77, 88, 99, 90], ‘k2‘: [11, 22, 33, 44, 55]})
View Code

Counter

Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素作為key,其計數作為value。計數值可以是任意的Interger(包括0和負數)。Counter類和其他語言的bags或multisets很相似

from collections import Counter
lst = [1, 2, 3, 3, 2, 4, 5, 3, 1, 0, 0]
print(Counter(lst))   # Counter({3: 3, 1: 2, 2: 2, 0: 2, 4: 1, 5: 1})
s = "afshkfhsdjhfakjhsdhajkd"
print(Counter(s))   # Counter({‘h‘: 5, ‘a‘: 3, ‘f‘: 3, ‘s‘: 3, ‘k‘: 3, ‘d‘: 3, ‘j‘: 3})

python模塊之collections random