collections --- kiểu dữ liệu tập hợp và container

Mô-đun này cung cấp các kiểu dữ liệu container chuyên biệt bổ sung cho các kiểu dựng sẵn list, tuple, dictset: hàng đợi hai đầu (deque), factory tạo tuple có tên trường (namedtuple()), và dict bảo toàn thứ tự (OrderedDict).

Lớp

class collections.deque(iterable: Iterable, maxlen: int, flags: int = 0)

Deque (hàng đợi hai đầu) là container kiểu danh sách hỗ trợ thêm và lấy phần tử O(1) từ cả hai đầu. Deque mới được tạo với các đối số sau:

  • iterable là một iterable dùng để khởi tạo deque khi tạo ra. Có thể là tuple hoặc list rỗng để tạo deque ban đầu trống.

  • maxlen phải được chỉ định và deque sẽ bị giới hạn ở độ dài tối đa này. Khi deque đầy, bất kỳ phần tử mới nào được thêm vào sẽ loại bỏ phần tử ở đầu đối diện.

  • Tham số flags tùy chọn có thể là 1 để kiểm tra tràn khi thêm phần tử.

Các đối tượng Deque hỗ trợ bool, len(), phép lặp và truy cập/gán theo chỉ số. Chúng cũng có các phương thức sau:

append(x: Any) None

Thêm x vào bên phải của deque. Ném ra IndexError nếu kiểm tra tràn được bật và không còn chỗ trong hàng đợi.

appendleft(x: Any) None

Thêm x vào bên trái của deque. Ném ra IndexError nếu kiểm tra tràn được bật và không còn chỗ trong hàng đợi.

pop() Any

Xóa và trả về một phần tử từ bên phải của deque. Ném ra IndexError nếu không có phần tử nào.

popleft() Any

Xóa và trả về một phần tử từ bên trái của deque. Ném ra IndexError nếu không có phần tử nào.

extend(iterable: Iterable) None

Mở rộng deque bằng cách thêm tất cả các phần tử từ iterable vào bên phải của deque. Ném ra IndexError nếu kiểm tra tràn được bật và không còn chỗ trong deque.

collections.namedtuple(name: str, fields: str | Sequence[str]) type

Đây là hàm factory để tạo kiểu namedtuple mới với tên và tập hợp các trường cụ thể. Một namedtuple là lớp con của tuple cho phép truy cập các trường không chỉ bằng chỉ số số, mà còn bằng cú pháp truy cập thuộc tính dùng tên trường ký hiệu. Fields là một chuỗi các chuỗi ký tự xác định tên trường. Để tương thích với CPython, có thể là một chuỗi có tên trường phân cách bằng dấu cách (nhưng kém hiệu quả hơn). Ví dụ sử dụng:

from collections import namedtuple

MyTuple = namedtuple("MyTuple", ("id", "name"))
t1 = MyTuple(1, "foo")
t2 = MyTuple(2, "bar")
print(t1.name)
assert t2.name == t2[1]

Các thực thể cũng cung cấp phương thức sau:

collections._asdict() OrderedDict

Trả về tên trường và giá trị của chúng dưới dạng OrderedDict.

class collections.OrderedDict(*args: Any, **kwargs: Any)

Lớp con của kiểu dict ghi nhớ và bảo toàn thứ tự các khóa được thêm vào. Chấp nhận các hình thức khởi tạo giống như dict (một iterable các cặp (key, value), một mapping khác, hoặc đối số từ khóa). Khi lặp qua ordered dict, các khóa/phần tử được trả về theo thứ tự chúng được thêm vào:

from collections import OrderedDict

# To make benefit of ordered keys, OrderedDict should be initialized
# from sequence of (key, value) pairs.
d = OrderedDict([("z", 1), ("a", 2)])
# More items can be added as usual
d["w"] = 5
d["b"] = 3
for k, v in d.items():
    print(k, v)

Kết quả đầu ra:

z 1
a 2
w 5
b 3
popitem() Tuple

Xóa và trả về một cặp (key, value) từ dictionary. Các cặp được trả về theo thứ tự LIFO.

Sự khác biệt với CPython

OrderedDict.popitem() không hỗ trợ đối số last=False và sẽ luôn xóa và trả về phần tử cuối cùng nếu có.

Một cách giải quyết là dùng pop(<first_key>) để xóa phần tử đầu tiên:

first_key = next(iter(d))
d.pop(first_key)