如何在 Python 中查詢最大或最小專案?
本文面向希望使用 Python 查詢最大或最小專案的開發人員。我將展示一些使用方法,並總結出最適合您的方法。
方法 1:在列表上使用切片方法
如果您只是嘗試查詢單個最小或最大專案,即 N = 1,則使用 min() 和 max() 速度更快。
讓我們從生成一些隨機整數開始。
import random # Create a random list of integers random_list = random.sample(range(1,10),9) random_list
輸出
[2, 4, 5, 1, 7, 9, 6, 8, 3]
查詢最小和最大專案 (N=1)
# Find the smallest number (N=1) min ( random_list )
輸出
1
# Find the largest number (N=1) max ( random_list )
輸出
9
查詢 3 個最小和最大專案 (N=3)
類似地,如果 N 與集合本身的大小大致相同,則通常先對其進行排序並獲取 N 的切片速度更快。
# lets get the nsmallest using a slice approach(N=3) sorted(random_list)[:3]
輸出
[1, 2, 3]
# lets get the nlargest using a slice approach(N=3) sorted(random_list)[-3:]
輸出
[7, 8, 9]
方法 2:在列表上使用 heapq 方法
heapq 模組有兩個函式——nlargest() 和 nsmallest(),可用於查詢 n 個最小或最大的專案。
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]
如果您有更復雜的資料,heapq 函式具有可使用的 key 引數。
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輸出
[{'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
輸出
[{'name': 'Roger Federer', 'titles': 20}, {'name': 'Rafel Nadal', 'titles': 19}, {'name': 'Novak Djokovic', 'titles': 17}]從 DataFrame 中查詢 N 個最大和最小值。
好吧,世界是由 CSV 檔案組成的,是的,它們確實存在!
因此,可以非常安全地假設在您的 Python 開發過程中,您會在某些時候遇到 CSV,並且顯然還會遇到 DataFrame。
我將向您展示幾種從 DataFrame 中查詢 N 個最大/最小值的方法。
在第一種方法中,我們將使用 sort_values() 方法對值進行排序,並使用 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)輸出
player title _______________ Murray 3 Djokovic 17 Nadal 19
# nlargest (N = 3)
df.sort_values("titles",ascending = False).head(3)輸出
player title _______________ Federer 20 Nadal 19 Djokovic 17
除了對行進行排序並使用 .head() 方法外,我們還可以呼叫 .nsmallest() 和 .nlargest() 方法。
df.nsmallest(3,columns="titles")
輸出
player title _______________ Murray 3 Djokovic 17 Nadal 19
df.nlargest(3,columns = "titles")
輸出
player title _______________ Federer 20 Nadal 19 Djokovic 17
結論
如果您嘗試查詢相對較少的專案,那麼 nlargest() 和 nsmallest() 函式最合適。
如果您只是嘗試查詢單個最小或最大專案 (N=1),則使用 min() 和 max() 速度更快。
類似地,如果 N 與集合本身的大小大致相同,則通常先對其進行排序並獲取切片速度更快。
總之,nlargest() 和 nsmallest() 的實際實現會根據 Python 的執行方式進行自適應調整,並代表您執行一些最佳化。
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP