Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Cách tìm phần tử lớn nhất hoặc nhỏ nhất trong Python

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.