Đếm tần suất xuất hiện của từng giá trị cho một key cụ thể trong danh sách các dictionary. Sử dụng itertools.groupby và lambda.
Mã nguồn
from itertools import groupby
my_dict = [
{'pyt': 13, 'fun': 44},
{'pyt': 63, 'best': 15},
{'pyt': 24, 'fun': 34},
{'pyt': 47, 'best': 64}
]
print("Danh sách dictionary:", my_dict)
my_key = 'pyt'
print("Key:", my_key)
# groupby yêu cầu dữ liệu đã sắp xếp theo key
my_result = [{keys: len(list(value))} for keys, value in groupby(my_dict, lambda index: index[my_key])]
print("Kết quả:", my_result)
Kết quả
Danh sách dictionary: [{'pyt': 13, 'fun': 44}, {'pyt': 63, 'best': 15}, {'pyt': 24, 'fun': 34}, {'pyt': 47, 'best': 64}]
Key: pyt
Kết quả: [{13: 1}, {63: 1}, {24: 1}, {47: 1}]
Giải thích
groupby(iterable, keyfunc)nhóm các phần tử liên tiếp có cùng key.lambda index: index[my_key]trích xuất giá trị key 'pyt' từ mỗi dict.- Dữ liệu CHƯA được sắp xếp theo 'pyt' (13, 63, 24, 47) → mỗi nhóm size=1.
- Kết quả: list dict {giá_trí: số_lần} cho từng nhóm liên tiếp.
Quan trọng: Cần sắp xếp trước
# Sắp xếp trước khi groupby
sorted_dicts = sorted(my_dict, key=lambda d: d[my_key])
my_result = [{k: len(list(g))} for k, g in groupby(sorted_dicts, lambda d: d[my_key])]
# Kết quả: [{13:1}, {24:1}, {47:1}, {63:1}] (vẫn 1 vì giá trị đều khác nhau)
Nếu muốn đếm tổng thể (không yêu cầu liên tiếp), dùng Counter:
from collections import Counter
cnt = Counter(d[my_key] for d in my_dict)
print(dict(cnt)) # {13:1, 63:1, 24:1, 47:1}