Mô-đun bộ sưu tập Python: Các loại vùng chứa nâng cao

Tìm hiểu cách sử dụng mô-đun bộ sưu tập của Python. Bộ đếm chính, defaultdict, namtuple, deque và cách đơn giản hóa các cấu trúc dữ liệu phức tạp.

Thử trong Trình chỉnh sửa

Tổng quan

Trong khi các vùng chứa cơ bản của Python—danh sách, từ điển, bộ và bộ dữ liệu—là đủ cho hầu hết các tác vụ, thì các chương trình phức tạp thường yêu cầu các cấu trúc dữ liệu chuyên biệt. Để giải quyết vấn đề này, Python cung cấp mô-đun `bộ sưu tập` tích hợp sẵn. Mô-đun này chứa các kiểu dữ liệu vùng chứa hiệu suất cao được thiết kế để giải quyết các tác vụ lập trình phổ biến hiệu quả hơn và có cú pháp tự ghi tài liệu rõ ràng hơn.

Trong số các lớp hữu ích nhất là `defaultdict`, hoạt động giống như một từ điển thông thường nhưng tự động khởi tạo các khóa bị thiếu với giá trị mặc định (như danh sách trống hoặc số nguyên 0), loại bỏ nhu cầu kiểm tra khóa dài dòng. Một sức mạnh khác là lớp `Counter`, được tối ưu hóa đặc biệt để kiểm đếm số lần xuất hiện của các mục trong một lần lặp. Đối với các hàng đợi và ngăn xếp nhanh, `deque` (hàng đợi hai đầu) cung cấp tính năng chèn và xóa `O(1)` ở cả hai đầu, không giống như các danh sách bị dịch chuyển `O(N)`.

Cuối cùng, mô-đun này cung cấp `namedtuple`, tạo ra các đối tượng nhẹ, giống như bộ dữ liệu có thể được truy cập bằng cách sử dụng ký hiệu dấu chấm cũng như các chỉ mục truyền thống (ví dụ: `point.x` thay vì `point[0]`). Điều này mang lại cho bạn tốc độ và tính bất biến của một bộ dữ liệu với khả năng đọc của một lớp. Việc kết hợp mô-đun bộ sưu tập vào quy trình làm việc của bạn đảm bảo rằng mã của bạn vẫn tinh tế, hiệu quả và rõ ràng.

Đầu ra mã & thực thi

Kiểm đếm các từ bằng cách sử dụng Counter và tổ chức các nhóm từ điển với defaultdict.

from collections import Counter, defaultdict, namedtuple

# 1. Counter: Tallying items
votes = ["yes", "no", "yes", "yes", "no"]
vote_counts = Counter(votes)
print(f"Vote Counts: {vote_counts}")
print(f"Most common: {vote_counts.most_common(1)}")

# 2. defaultdict: Grouping values
grouped_data = defaultdict(list)
grouped_data["engineers"].append("Alice")
grouped_data["engineers"].append("Bob")
print(f"Grouped Data: {dict(grouped_data)}")

# 3. namedtuple: Clean records
Point = namedtuple("Point", ["x", "y"])
p = Point(10, 20)
print(f"Point x: {p.x}, Point y: {p.y}")
Đầu ra thiết bị đầu cuối
Vote Counts: Counter({'yes': 3, 'no': 2})
Most common: [('yes', 3)]
Grouped Data: {'engineers': ['Alice', 'Bob']}
Point x: 10, Point y: 20

Triển khai từng bước

  • Phân tích tệp nhật ký để đếm số lần xuất hiện lỗi thông qua Bộ đếm
  • Xây dựng hàng đợi ưu tiên hoặc lập lịch tác vụ bằng cách sử dụng deque
  • Biểu diễn kích thước tọa độ hoặc bản ghi dữ liệu bằng cách sử dụng bộ tên

Câu hỏi thường gặp

Tại sao deque nhanh hơn danh sách cho các hoạt động xếp hàng?

Một danh sách yêu cầu dịch chuyển tất cả các phần tử tiếp theo trong bộ nhớ khi chèn hoặc xóa từ phía trước (O(N)). Deque được triển khai dưới dạng danh sách liên kết đôi, cho phép thực hiện các thao tác O(1) ở cả hai đầu.

Tôi có thể thay đổi các thành phần của một bộ có tên không?

Không. Vì các bộ dữ liệu được đặt tên kế thừa từ các bộ dữ liệu tiêu chuẩn nên chúng hoàn toàn không thể thay đổi. Bạn phải sử dụng phương thức ._replace() để trả về một phiên bản được sửa đổi mới.

Chủ đề liên quan

Tài nguyên Python được đề xuất

Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.