如何在 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 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告