如何在 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 的运行方式进行自适应调整,并代表您执行一些优化。
广告