Bài viết này dành cho các nhà phát triển muốn tìm phần tử lớn nhất hoặc nhỏ nhất với Python. Tôi sẽ trình bày một vài phương pháp và kết luận phương pháp tốt nhất cho bạn.
Phương pháp 1: Cách tiếp cận cắt slice trên List
Nếu bạn chỉ cần tìm phần tử nhỏ nhất hoặc lớn nhất đơn lẻ (N = 1), nhanh hơn là sử dụng min() và max().
Hãy bắt đầu bằng cách tạo một số số nguyên ngẫu nhiên.
import random # Tạo danh sách số nguyên ngẫu nhiên random_list = random.sample(range(1, 10), 9) random_list
[2, 4, 5, 1, 7, 9, 6, 8, 3]
TÌM PHẦN TỬ NHỎ NHẤT VÀ LỚN NHẤT (N=1)
# Tìm số nhỏ nhất (N=1) min(random_list)
1
# Tìm số lớn nhất (N=1) max(random_list)
9
TÌM 3 PHẦN TỬ NHỎ NHẤT VÀ LỚN NHẤT (N=3)
Tương tự, nếu N xấp xỉ kích thước của tập hợp, thường nhanh hơn là sắp xếp trước rồi cắt slice N phần tử.
# Lấy nsmallest bằng cách cắt slice (N=3) sorted(random_list)[:3]
[1, 2, 3]
# Lấy nlargest bằng cách cắt slice (N=3) sorted(random_list)[-3:]
[7, 8, 9]
Phương pháp 2: Module heapq trên List
Module heapq có hai hàm nlargest() và nsmallest() có thể dùng để tìm N phần tử nhỏ nhất hoặc lớn nhất.
import heapq import random random_list = random.sample(range(1, 10), 9) # nsmallest items (N=3) heapq.nsmallest(3, random_list)
[1, 2, 3]
# nlargest items (N=3) heapq.nlargest(3, random_list)
[9, 8, 7]
Nếu bạn có dữ liệu phức tạp hơn một chút, các hàm heapq có tham số key có thể sử dụng.
import heapq
grandslams = [
{'name': 'Roger Federer', 'titles': 20},
{'name': 'Rafel Nadal', 'titles': 19},
{'name': 'Novak Djokovic', 'titles': 17},
{'name': 'Andy Murray', 'titles': 3},
]
# Vận động viên có ít danh hiệu nhất (N=3)
less = heapq.nsmallest(3, grandslams, key=lambda s: s['titles'])
less
[{'name': 'Andy Murray', 'titles': 3},
{'name': 'Novak Djokovic', 'titles': 17},
{'name': 'Rafel Nadal', 'titles': 19}]
# Vận động viên có nhiều danh hiệu nhất (N=3) more = heapq.nlargest(3, grandslams, key=lambda s: s['titles']) more
[{'name': 'Roger Federer', 'titles': 20},
{'name': 'Rafel Nadal', 'titles': 19},
{'name': 'Novak Djokovic', 'titles': 17}]
Tìm N phần tử lớn nhất và nhỏ nhất từ DataFrame
Thực tế, thế giới này được tạo thành từ các file CSV, đúng không? Vì vậy, rất an toàn khi giả định rằng tại một thời điểm nào đó trong phát triển Python của bạn, bạn sẽ gặp CSV và显然 là DataFrame.
Tôi sẽ chỉ cho bạn một vài phương pháp để tìm N phần tử lớn nhất/nhỏ nhất từ DataFrame.
Trong phương pháp đầu tiên, chúng ta sẽ sắp xếp giá trị sử dụng phương thức sort_values() và lấy giá trị bằng phương thức head().
import pandas as pd import io # Định nghĩa dữ liệu data = """player,titles Djokovic,17 Nadal,19 Federer,20 Murray,3""" throwaway_storage = io.StringIO(data) df = pd.read_csv(throwaway_storage, index_col="player")
# nsmallest (N = 3)
df.sort_values("titles").head(3)
titles player Murray 3 Djokovic 17 Nadal 19
# nlargest (N = 3)
df.sort_values("titles", ascending=False).head(3)
titles player Federer 20 Nadal 19 Djokovic 17
Thay vì sắp xếp các hàng và sử dụng phương thức .head(), chúng ta có thể gọi trực tiếp các phương thức .nsmallest() và .nlargest().
df.nsmallest(3, columns="titles")
titles player Murray 3 Djokovic 17 Nadal 19
df.nlargest(3, columns="titles")
titles player Federer 20 Nadal 19 Djokovic 17
Kết luận
- Nếu bạn đang cố gắng tìm một số lượng phần tử tương đối nhỏ, thì các hàm
nlargest()vànsmallest()là phù hợp nhất. - Nếu bạn chỉ cố gắng tìm phần tử nhỏ nhất hoặc lớn nhất đơn lẻ (N=1), nhanh hơn là dùng
min()vàmax(). - Tương tự, nếu N xấp xỉ kích thước của tập hợp, thường nhanh hơn là sắp xếp trước rồi cắt slice.
- Tóm lại, việc triển khai thực tế của
nlargest()vànsmallest()thích ứng với cách Python hoạt động và sẽ tự động thực hiện một số tối ưu hóa thay mặt bạn.