如何在Python中找到最大或最小项?
本文旨在向想要使用Python查找最大或最小项的开发人员展示几种方法,并总结最佳方法。
阅读更多:Python 教程
方法一:使用列表切片
如果您只是想找到单个最小或最大项,即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 = 3)获取nsmallest
sorted(random_list)[:3]
输出
[1, 2, 3]
#使用切片方法(N = 3)获取nlargest
sorted(random_list)[-3:]
输出
[7, 8, 9]
方法二:列表的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项(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},]
#获得较少标题的选手(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}]
#获得最高标题的选手(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
# 定义数据
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)
输出
选手 标题
_________________
费德勒 20
纳达尔 19
德约科维奇 17
如果不想对行进行排序并使用.head()方法,我们可以调用.nsmallest()和.nlargest()方法。
df.nsmallest(3, columns="titles")
结果
选手 标题
_________________
穆雷 3
德约科维奇 17
纳达尔 19
df.nlargest(3,columns="titles")
结果
选手 标题
_________________
费德勒 20
纳达尔 19
德约科维奇 17
结论
如果要查找相对较少的项,则nlargest()和nsmallest()函数最合适。
如果您只想找到单个最小或最大的项(N=1),使用min()和max()会更快。
同样,如果N的大小与集合本身的大小差不多,则通常先对其进行排序并取一个切片会更快。
总之,nlargest()和nsmallest()的实际实现是适应python操作的,将自动为您执行一些这些优化。
极客教程