Bài học theo mô-đun (3/4)
bộ sưu tập: Bộ đếm và defaultdict
Mô-đun collections thêm các loại dữ liệu chuyên dụng mở rộng
các bộ sưu tập tích hợp sẵn. Ba cái được sử dụng nhiều nhất: Counter, defaultdict,
namedtuple.
Counter: đếm tần số
from collections import Counter
parole = ["mela", "pera", "mela", "kiwi", "mela", "pera"]
c = Counter(parole)
# Counter({'mela': 3, 'pera': 2, 'kiwi': 1})
c["mela"] # 3
c["banana"] # 0 (default for missing keys, NO KeyError)
c.most_common(2) # [('mela', 3), ('pera', 2)]Nó cũng hoạt động trên chuỗi (đếm ký tự):
Counter("ciao mondo")
# Counter({'o': 2, 'c': 1, 'i': 1, 'a': 1, ' ': 1, 'm': 1, 'n': 1, 'd': 1})Nó hỗ trợ các hoạt động giống như tập hợp trên số lượng (+, -, &, |) - rất tiện dụng để tổng hợp số lượng từ các nguồn khác nhau.
defaultdict: dict với mặc định tự động
Một lệnh rằng, khi bạn truy cập vào một khóa bị thiếu, tạo nó bằng cách gọi một nhà máy.
from collections import defaultdict
gruppi = defaultdict(list) # factory = list (empty list)
for nome in ["Ada", "Linus", "Ada", "Grace"]:
gruppi[nome].append(1)
# defaultdict(list, {'Ada': [1, 1], 'Linus': [1], 'Grace': [1]})Nếu không có defaultdict, bạn sẽ phải viết:
gruppi = {}
for nome in [...]:
if nome not in gruppi:
gruppi[nome] = []
gruppi[nome].append(1)Các nhà máy phổ biến: list, int (mặc định 0), set, dict.
namedtuple: bộ dữ liệu có tên trường
Một cách nhẹ nhàng để tạo các lớp bản ghi bất biến. Nó là một bộ dữ liệu, nhưng với quyền truy cập trường theo tên.
from collections import namedtuple
Punto = namedtuple("Punto", ["x", "y"])
p = Punto(3, 4)
p.x # 3 (access by name)
p[0] # 3 (access by index, still a tuple)
p.x + p.y # 7
# typical use: return multiple values from a function
def divisione(a, b):
Risultato = namedtuple("Risultato", ["quoziente", "resto"])
return Risultato(a // b, a % b)
r = divisione(17, 5)
r.quoziente # 3
r.resto # 2(Đối với các trường hợp phức tạp hơn cũng có dataclasses kể từ 3.7 — xem M9.)
có têntuple: hồ sơ bất biến nhẹ
Mô-đun collections cũng xuất namedtuple, cho phép bạn nhanh chóng xây dựng các đối tượng nhẹ giống như lớp để lưu trữ dữ liệu có cấu trúc mà không cần viết hàm tạo hoặc phương thức soạn sẵn:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)Hãy thử nó
Cho danh sách `words = ['mela', 'pera', 'mela', 'kiwi', 'mela', 'pera']`, tính từ thường xuyên nhất trong `top` dưới dạng một chuỗi. Đánh giá `đỉnh`.
Hiển thị gợi ý
Counter(...).most_common(1) trả về [(từ, số lượng)].
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Cho các sinh viên `enrollments = [('Ada', 'mate'), ('Linus', 'fisica'), ('Ada', 'storia'), ('Grace', 'mate')]`, xây dựng `courses_per_student` dưới dạng defaultdict(list). Đánh giá `dict(khóa học_per_student)`.
Hiển thị gợi ý
defaultdict(list) sau đó cho s, c trong tuyển sinh.
Giải pháp khả dụng sau 3 lần thử
Thử thách bổ sung
Nhập \`Bộ đếm\` từ \`bộ sưu tập\`. Đếm tần suất các ký tự trong chuỗi \`text="abracadabra"\`. Lưu trữ bộ đếm trong \`char_counter\` và đánh giá nó.
Hiển thị gợi ý
Bộ đếm lấy chuỗi làm tham số và đếm số lần xuất hiện của mỗi chữ cái.
Giải pháp khả dụng sau 3 lần thử