Ta có một danh sách các tuple. Trong đó ta cần tìm top k phần tử xuất hiện nhiều nhất. Nếu k là 3, ta cần tìm 3 phần tử hàng đầu từ các tuple bên trong danh sách.
Với defaultdict
Ta đưa các phần tử vào container dictionary dùng defaultdict. Sau đó chỉ tìm các phần tử thỏa mãn điều kiện top k.
Ví dụ
import collections from operator import itemgetter from itertools import chain # Khởi tạo list đầu vào listA = [[('Mon', 126)], [('Tue', 768)],[('Wed', 512)], [('Thu', 13)],[('Fri', 341)]] # đặt K K = 3 #Danh sách cho trước print("Given list:\n",listA) print("Check value:\n",K) # Sử dụng defaultdict dict_ = collections.defaultdict(list) new_list = list(chain.from_iterable(listA)) for elem in new_list: dict_[elem[0]].append(elem[1]) res = {k: sum(v) for k, v in dict_.items()} # Sử dụng sorted res = sorted(res.items(), key=itemgetter(1), reverse=True)[0:K] # Đầu ra print("Top 3 elements are:\n", res)Đầu ra
Chạy mã trên cho kết quả sau:
Given list: [[('Mon', 126)], [('Tue', 768)], [('Wed', 512)], [('Thu', 13)], [('Fri', 341)]] Check value: 3 Top 3 elements are: [('Tue', 768), ('Wed', 512), ('Fri', 341)]Với sorted và itemgetter
Trong cách này ta dùng hàm itemgetter nhưng áp dụng trong hàm sorted với khoảng từ 0 đến K.
Ví dụ
from operator import itemgetter from itertools import chain # Khởi tạo list đầu vào listA = [[('Mon', 126)], [('Tue', 768)],[('Wed', 512)], [('Thu', 13)],[('Fri', 341)]] # đặt K K = 3 #Danh sách cho trước print("Given list:\n",listA) print("Check value:\n",K) # Sử dụng sorted res = sorted(list(chain.from_iterable(listA)), key=itemgetter(1), reverse=True)[0:K] # Đầu ra print("Top 3 elements are:\n", res)Đầu ra
Chạy mã trên cho kết quả sau:
Given list: [[('Mon', 126)], [('Tue', 768)], [('Wed', 512)], [('Thu', 13)], [('Fri', 341)]] Check value: 3 Top 3 elements are: [('Tue', 768), ('Wed', 512), ('Fri', 341)]