Bộ đếm (Counter) trong Python

Category: Python

Counter là một lớp con của lớp dict trong mô-đun collections của Python. Chúng được sử dụng để đếm số lần xuất hiện của các phần tử trong một iterable hoặc để đếm tần suất của các mục trong một ánh xạ (mapping). Counter cung cấp một cách sạch sẽ và hiệu quả để tính tổng các phần tử và thực hiện nhiều thao tác khác liên quan đến việc đếm.

Ví dụ:

from collections import Counter

# Ví dụ danh sách các phần tử
val = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

# Tạo bộ đếm
ctr = Counter(val)

print(ctr)

Đầu ra:

Counter({4: 4, 3: 3, 2: 2, 1: 1})

Trong ví dụ này, Bộ đếm đếm số lần xuất hiện của từng phần tử trong danh sách.

Chúng ta hãy cùng xem xét chi tiết về bộ đếm trong Python:

Cú pháp

class collections.Counter([iterable-or-mapping])

Tham số:
Hàm tạo của Counter có thể được gọi theo bất kỳ cách nào sau đây:

  • Với một chuỗi các mục

  • Với một từ điển chứa các khóa và số lượng

  • Với các đối số từ khóa ánh xạ tên chuỗi thành số lượng

Kiểu trả về: Trả về một đối tượng Counter (về mặt chức năng, nó giống như từ điển)

Tạo một bộ đếm

Để sử dụng Counter, trước tiên chúng ta cần nhập nó từ mô-đun collections.

from collections import Counter

# Tạo một bộ đếm từ danh sách
ctr1 = Counter([1, 2, 2, 3, 3, 3])

# Tạo một bộ đếm từ một từ điển
ctr2 = Counter({1: 2, 2: 3, 3: 1})

# Tạo một bộ đếm từ một chuỗi
ctr3 = Counter('hello')

print(ctr1)
print(ctr2)
print(ctr3)

Đầu ra:

Counter({3: 3, 2: 2, 1: 1})
Counter({2: 3, 1: 2, 3: 1})
Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})

Trong các ví dụ này, chúng ta tạo Bộ đếm từ các loại đối tượng lặp khác nhau.

Truy cập phần tử trong Counter

Chúng ta có thể truy cập số lượng của từng phần tử bằng cách sử dụng phần tử làm khóa. Nếu một phần tử không có trong Counter, nó sẽ trả về 0.

Ví dụ:

from collections import Counter

ctr = Counter([1, 2, 2, 3, 3, 3])

# Truy cập số lượng phần tử
print(ctr[1])  
print(ctr[2])  
print(ctr[3])  
print(ctr[4]) # (phần tử không có)

Đầu ra:

1 
2 
3 
0

Ví dụ này cho thấy cách truy cập vào số lượng phần tử cụ thể trong Bộ đếm.

Cập nhật Counter

Counter có thể được cập nhật bằng cách thêm phần tử mới hoặc cập nhật số lượng phần tử hiện có. Sử dụng phương thức update() để thực hiện điều này.

Ví dụ:

from collections import Counter

ctr = Counter([1, 2, 2])

# Adding new elements
ctr.update([2, 3, 3, 3])

print(ctr)

Đầu ra:

Counter({2: 3, 3: 3, 1: 1})

Các phương thức của Counter

1. elements()

Trả về một trình lặp qua các phần tử, mỗi phần tử được lặp lại nhiều lần theo số lượng của nó. Thứ tự trả về là tùy ý.

from collections import Counter

ctr = Counter([1, 2, 2, 3, 3, 3])
items = list(ctr.elements())

print(items)

Đầu ra:

[1, 2, 2, 3, 3, 3]

Giải thích: phương thức elements() trả về một trình lặp tạo ra tất cả các phần tử trong Counter.

2. most_common([n])

Trả về danh sách n phần tử phổ biến nhất và số lượng tương ứng, theo thứ tự giảm dần. Nếu không truyền tham số n, nó sẽ trả về tất cả các phần tử.

from collections import Counter

ctr = Counter([1, 2, 2, 3, 3, 3])
common = ctr.most_common(2)

print(common)

Đầu ra:

[(3, 3), (2, 2)]

3. subtract()

Trừ số lượng phần tử bằng cách sử dụng một đối tượng iterable hoặc mapping khác. Số lượng có thể trở thành âm nếu bị trừ quá nhiều.

from collections import Counter

ctr = Counter([1, 2, 2, 3, 3, 3])
ctr.subtract([2, 3, 3])

print(ctr)

Đầu ra:

Counter({1: 1, 2: 1, 3: 1})

Giải thích: phương thức minus() giảm số lượng các phần tử được tìm thấy trong một đối tượng lặp khác.

Các phép toán số học với Counter

Counter hỗ trợ các phép toán như: cộng, trừ, giao (intersection)hợp (union).

Ví dụ:

from collections import Counter

ctr1 = Counter([1, 2, 2, 3])
ctr2 = Counter([2, 3, 3, 4])

# Phép cộng
print(ctr1 + ctr2)  
# Phép trừ
print(ctr1 - ctr2)  

# Intersection
print(ctr1 & ctr2)  
# Union
print(ctr1 | ctr2)

Đầu ra:

Counter({2: 3, 3: 3, 1: 1, 4: 1})
Counter({1: 1, 2: 1})
Counter({2: 1, 3: 1})
Counter({2: 2, 3: 2, 1: 1, 4: 1})

Published on Jun 19, 2025