Chuyển đến nội dung chính
Mô-đun 8 · Bài học 3 trong tổng số 431/36 trong khóa học~12 min
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ố

Python
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ự):

Python
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.

Python
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:

Python
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.

Python
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:

Python
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)

Hãy thử nó

tập thể dục#python.m8.l3.e1
Nỗ lực: 0Đang tải…

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`.

Đang tải trình chỉnh sửa…
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

tập thể dục#python.m8.l3.e2
Nỗ lực: 0Đang tải…

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)`.

Đang tải trình chỉnh sửa…
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

tập thể dục#python.m8.l3.e3
Nỗ lực: 0Đang tải…

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ó.

Đang tải trình chỉnh sửa…
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ử