tecapres,Python 模塊 collections?

簡介

collections 是 python 的內(nèi)置模塊,提供了很多方便且高性能的關(guān)于集合的操作,掌握這些知識有助于提高代碼的性能和可讀性。

常用功能

namedtuple 功能詳解

namedtuple() 返回一個新的元組子類,且規(guī)定了元組的元素的個數(shù),同時除了使用下標(biāo)獲取元素之外,還可以通過屬性直接獲取。

from collections import namedtuple
User = namedtuple("User",["name", "age", "weight"])
user = User("admin", "20", "60")
name, age, weight = user
print(user[0])
print(name, age, weight)
print(user.name, user.age, user.weight)

# 輸出結(jié)果如下
admin
admin 20 60
admin 20 60

由以上代碼可以看出,namedtuple() 相當(dāng)于直接定義了一個新的類,但是這個類跟傳統(tǒng)的定義 class 的方式又有著巨大的區(qū)別。該方式會比直接定義 class 的方式省很多空間,其次其返回值是一個 tuple,支持 tuple 的各種操場。

同時,namedtuple() 還自帶兩個非常好用的方法。

# 將序列直接轉(zhuǎn)換為新的 tuple 對象
user = ["root", 32, 65]
user = User._make(user) 
print(user) 
# 輸出 User(name='root', age=32, weight=65)

# 返回一個 dict
user = User("admin", 20, 60)
print(user._asdict()) 
# 輸出 OrderedDict([('name', 'admin'), ('age', 20), ('weight', 60)])

ChainMap 功能講解

ChainMap() 可以將多個字典集合到一個字典中去,對外提供一個統(tǒng)一的視圖。注意:該操作并是不將所有字典做了一次拷貝,實際上是在多個字典的上層又進行了一次封裝而已。

from collections import ChainMap

user1 = {"name":"admin", "age":"20"}
user2 = {"name":"root", "weight": 65}
users = ChainMap(user1, user2)
print(users.maps)

users.maps[0]["name"] = "tiger"
print(users.maps)

for key, value in users.items():
    print(key, value)

# 輸出如下
[{'name': 'admin', 'age': '20'}, {'name': 'root', 'weight': 65}]
[{'name': 'tiger', 'age': '20'}, {'name': 'root', 'weight': 65}]
name tiger
weight 65
age 20

由此可見,如果 ChainMap() 中的多個字典有重復(fù) key,查看的時候可以看到所有的 key,但遍歷的時候卻只會遍歷 key 第一次出現(xiàn)的位置,其余的忽略。同時,我們可以通過返回的新的視圖來更新原來的的字典數(shù)據(jù)。進一步驗證了該操作不是做的拷貝,而是直接指向原字典。

deque 功能詳解

dqueue 是 ”double-ended queue” 的簡稱,是一種類似列表(list)的容器,實現(xiàn)了在兩端快速添加(append)和彈出(pop)操作。大大加快了遍歷速度

from collections import deque
q = deque([1, 2, 3])
q.append('4')
q.appendleft('0')
print(q)
print(q.popleft())

# 輸出如下
deque(['0', 1, 2, 3, '4'])
0

Counter 功能詳解

Counter 可以簡單理解為一個計數(shù)器,可以統(tǒng)計每個元素出現(xiàn)的次數(shù),同樣 Counter() 是需要接受一個可迭代的對象的。

from collections import Counter

animals = ["cat", "dog", "cat", "bird", "horse", "tiger", "horse", "cat"]
animals_counter = Counter(animals)
print(animals_counter)
print(animals_counter.most_common(2))

Counter({'cat': 3, 'horse': 2, 'dog': 1, 'bird': 1, 'tiger': 1})
[('cat', 3), ('horse', 2)]

# 輸出如下
Counter({'cat': 3, 'horse': 2, 'dog': 1, 'bird': 1, 'tiger': 1})
[('cat', 3), ('horse', 2)]

其實一個 Counter 就是一個字典,其額外提供的 most_common() 函數(shù)通常用于求 Top k 問題。

OrderedDict 功能詳解

OrderedDict 是字典的子類,保證了元素的插入順序。在 3.7 版本下,字典同樣也保證了元素的插入順序。那相比內(nèi)置字典 OrderedDict 有哪些升級呢。

  • 算法上, OrderedDict 可以比 dict 更好地處理頻繁的重新排序操作。在跟蹤最近的訪問這種場景(例如在 LRU cache)下非常適用。
  • OrderedDict 類有一個 move_to_end() 方法,可以有效地將元素移動到任一端。
from collections import OrderedDict

user = OrderedDict()
user["name"] = "admin"
user["age"] = 23
user["weight"] = 65
print(user)
user.move_to_end("name") # 將元素移動至末尾
print(user)
user.move_to_end("name", last = False) # 將元素移動至開頭
print(user)

# 輸出如下
OrderedDict([('name', 'admin'), ('age', 23), ('weight', 65)])
OrderedDict([('age', 23), ('weight', 65), ('name', 'admin')])
OrderedDict([('name', 'admin'), ('age', 23), ('weight', 65)])

defaultdict 功能詳解

defaultdict 是內(nèi)置 dict 類的子類。它實現(xiàn)了當(dāng) key 不存在是返回默認(rèn)值的功能,除此之外,與內(nèi)置 dict 功能完全一樣。

from collections import defaultdict

default_dict = defaultdict(int)
default_dict["x"] = 10
print(default_dict["x"])
print(default_dict["y"])

# 輸出如下
10
0

注意,defaultdict 的參數(shù)必須是可操作的。比如 python 內(nèi)置類型,或者無參的可調(diào)用的函數(shù)。

def getUserInfo():
    return {
        "name" : "",
        "age" : 0
    }

default_dict = defaultdict(getUserInfo)
admin = default_dict["admin"]
print(admin)

admin["age"] = 34
print(admin)

# 輸出如下
{'name': '', 'age': 0}
{'name': '', 'age': 34}

上述示例我們給 defaultdict 傳了一個自定義函數(shù),當(dāng)字典中不存在所取 key 時返回默認(rèn)的用戶信息。

總結(jié)

本文總結(jié)了 collections 提供的便利的操作,掌握這些知識將大大提高你的編程效率。

好了,這篇文章的內(nèi)容發(fā)貨聯(lián)盟就和大家分享到這里,如果大家網(wǎng)絡(luò)推廣引流創(chuàng)業(yè)感興趣,可以添加微信:80709525  備注:發(fā)貨聯(lián)盟引流學(xué)習(xí); 我拉你進直播課程學(xué)習(xí)群,每周135晚上都是有實戰(zhàn)干貨的推廣引流技術(shù)課程免費分享!


版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 sumchina520@foxmail.com 舉報,一經(jīng)查實,本站將立刻刪除。

您可能還會喜歡:

發(fā)表評論

◎歡迎參與討論,請在這里發(fā)表您的看法、交流您的觀點。