Bài viết này hướng đến các nhà phát triển muốn tìm các mục lớn nhất hoặc nhỏ nhất bằng Python. Tôi sẽ chỉ ra một số phương pháp để sử dụng và sẽ kết luận phương pháp tốt nhất cho bạn.
Phương pháp - 1:Phương pháp tiếp cận cắt nhỏ trên một danh sách
Nếu bạn chỉ đang cố gắng tìm một mục nhỏ nhất hoặc lớn nhất, tức là N =1, thì việc sử dụng min () và max () sẽ nhanh hơn.
Chúng ta hãy bắt đầu bằng cách tạo một số số nguyên ngẫu nhiên.
import random # Create a random list of integers random_list = random.sample(range(1,10),9) random_list
Đầu ra
[2, 4, 5, 1, 7, 9, 6, 8, 3]
TÌM MỤC NHỎ NHẤT &LỚN NHẤT (N =1)
# Find the smallest number (N=1) min ( random_list )
Đầu ra
1
# Find the largest number (N=1) max ( random_list )
Đầu ra
9
TÌM 3 MỤC NHỎ NHẤT &LỚN NHẤT (N =3)
Tương tự, nếu N có cùng kích thước với chính bộ sưu tập, thì việc sắp xếp nó trước và lấy một phần N.
sẽ nhanh hơn.# lets get the nsmallest using a slice approach(N=3) sorted(random_list)[:3]
Đầu ra
[1, 2, 3]
# lets get the nlargest using a slice approach(N=3) sorted(random_list)[-3:]
Đầu ra
[7, 8, 9]
Phương pháp - 2:Phương thức heapq trên danh sách
Mô-đun heapq có hai hàm — nlargest () và nsmallest () có thể được sử dụng để tìm các mục 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)
Đầu ra
[1, 2, 3]
# nlargest items (N=3) heapq.nlargest(3,random_list)
Đầu ra
[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ó một tham số chính có thể được 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},] # Players with less titles (N=3) less = heapq.nsmallest(3,grandslams, key = lambdas:s['titles']) less
Đầu ra
[{'name': 'Andy Murray', 'titles': 3}, {'name': 'Novak Djokovic', 'titles': 17}, {'name': 'Rafel Nadal', 'titles': 19}]
# Players with highest titles (N=3) more = heapq.nlargest(3,grandslams,key = lambdas:s['titles']) more
Đầu ra
[{'name': 'Roger Federer', 'titles': 20}, {'name': 'Rafel Nadal', 'titles': 19}, {'name': 'Novak Djokovic', 'titles': 17}]
Tìm N Lớn nhất và Nhỏ nhất từ DataFrame.
Thế giới được tạo thành từ các tệp CSV, Đúng vậy !.
Vì vậy, rất an toàn nếu giả sử rằng tại một thời điểm nào đó trong quá trình phát triển python, bạn sẽ gặp phải CSV’s và dường nhưDataFrame.
Tôi sẽ chỉ cho bạn một số phương pháp để tìm N 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 các giá trị bằng phương thức sort_values () và chọn các giá trị bằng phương thức head.
import pandas as pd import io # Define your data 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)
Đầu ra
player title _______________ Murray 3 Djokovic 17 Nadal 19
# nlargest (N = 3) df.sort_values("titles",ascending = False).head(3)
Đầu ra
player title _______________ 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 phương thức .nsmallest () và .nlargest ().
df.nsmallest(3,columns="titles")
Đầu ra
player title _______________ Murray 3 Djokovic 17 Nadal 19
df.nlargest(3,columns = "titles")
Đầu ra
player title _______________ 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 mục tương đối nhỏ, thì các hàm nlargest () và nsmallest () là thích hợp nhất.
Nếu bạn chỉ đang cố gắng tìm một mục nhỏ nhất hoặc lớn nhất (N =1), thì việc sử dụng min () và max () sẽ nhanh hơn.
Tương tự, nếu N có cùng kích thước với chính bộ sưu tập, thì việc sắp xếp nó trước và lấy một phần sẽ nhanh hơn.
Tóm lại, việc triển khai thực tế của nlargest () và nsmallest () là thích ứng trong cách python hoạt động và sẽ thay mặt bạn thực hiện một số tối ưu hóa này.