簡介
collections 是 Python/ target=_blank class=infotextkey>Python 的內置模塊,提供了很多方便且高性能的關于集合的操作,掌握這些知識有助于提高代碼的性能和可讀性。
常用功能
namedtuple 功能詳解
namedtuple() 返回一個新的元組子類,且規定了元組的元素的個數,同時除了使用下標獲取元素之外,還可以通過屬性直接獲取。
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)
# 輸出結果如下
admin
admin 20 60
admin 20 60
由以上代碼可以看出,namedtuple() 相當于直接定義了一個新的類,但是這個類跟傳統的定義 class 的方式又有著巨大的區別。該方式會比直接定義 class 的方式省很多空間,其次其返回值是一個 tuple,支持 tuple 的各種操場。
同時,namedtuple() 還自帶兩個非常好用的方法。
# 將序列直接轉換為新的 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() 可以將多個字典集合到一個字典中去,對外提供一個統一的視圖。注意:該操作并是不將所有字典做了一次拷貝,實際上是在多個字典的上層又進行了一次封裝而已。
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() 中的多個字典有重復 key,查看的時候可以看到所有的 key,但遍歷的時候卻只會遍歷 key 第一次出現的位置,其余的忽略。同時,我們可以通過返回的新的視圖來更新原來的的字典數據。進一步驗證了該操作不是做的拷貝,而是直接指向原字典。
deque 功能詳解
dqueue 是 ”double-ended queue” 的簡稱,是一種類似列表(list)的容器,實現了在兩端快速添加(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 可以簡單理解為一個計數器,可以統計每個元素出現的次數,同樣 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() 函數通常用于求 Top k 問題。
OrderedDict 功能詳解
OrderedDict 是字典的子類,保證了元素的插入順序。在 3.7 版本下,字典同樣也保證了元素的插入順序。那相比內置字典 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 是內置 dict 類的子類。它實現了當 key 不存在是返回默認值的功能,除此之外,與內置 dict 功能完全一樣。
from collections import defaultdict
default_dict = defaultdict(int)
default_dict["x"] = 10
print(default_dict["x"])
print(default_dict["y"])
# 輸出如下
10
0
注意,defaultdict 的參數必須是可操作的。比如 python 內置類型,或者無參的可調用的函數。
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 傳了一個自定義函數,當字典中不存在所取 key 時返回默認的用戶信息。
總結
本文總結了 collections 提供的便利的操作,掌握這些知識將大大提高你的編程效率。