如何在 Python 中查找最大或最小项?
本文面向希望使用 Python 查找最大或最小项的开发人员。我将展示几种使用方法,并总结出最适合您的方法。
方法 – 1:列表上的切片方法
如果您只是想找到单个最小或最大项目,即 N = 1,使用 min() 和 max() 会更快。
让我们从生成一些随机整数开始。
import random # 创建一个随机整数列表 random_list = random.sample(range(1,10),9) random_list
输出
[2, 4, 5, 1, 7, 9, 6, 8, 3]
查找最小 &最大项目(N=1)
# 查找最小数字(N=1) min ( random_list )
输出
1
# 查找最大数字(N=1) max ( random_list )
输出
9
查找最小的 3 个 &最大的项目(N=3)
同样,如果 N 与集合本身的大小大致相同,通常先对其进行排序,然后取 N 的切片会更快。
# 让我们使用切片方法获取最小的 n 个项目(N=3) sorted(random_list)[:3]
输出
[1, 2, 3]
# 让我们使用切片方法获取最大的 n 个项目(N=3) sorted(random_list)[-3:]
输出
[7, 8, 9]
方法 – 2:列表上的 heapq 方法
heapq 模块有两个函数—nlargest() 和 nsmallest(),可用于查找 nsmallest 或 nlargest 项。
import heapq import random random_list = random.sample(range(1,10),9) # nsmallest 项(N=3) heapq.nsmallest(3,random_list)
输出
[1, 2, 3]
# nlargest items (N=3) heapq.nlargest(3,random_list)
输出
[9, 8, 7]
如果您有更复杂的数据,heapq 函数有一个可以使用的关键参数。
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
我们可以调用 .nsmallest() 和 .nlargest() 方法,而不是对行进行排序并使用 .head() 方法。
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 的操作方式相适应,并将为您执行其中一些优化。
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

