如何在 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 的執行方式進行自適應調整,並代表您執行一些最佳化。

更新於: 2020 年 11 月 10 日

371 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.