Python从迭代器中提取N个最大或N个最小的项目

示例

为了找到一个可迭代的最大或最小值的一定数目(不止一个),你可以使用nlargest与nsmallest该的heapq模块:

import heapq

# 从范围中获得5个最大物品

heapq.nlargest(5, range(10))
# 输出:[9、8、7、6、5]

heapq.nsmallest(5, range(10))
# 输出:[0、1、2、3、4]

这比对整个可迭代对象进行排序然后从头开始或头进行切片要有效得多。在内部,这些函数使用二进制堆优先级队列数据结构,对于此用例而言,此结构非常有效。

像和一样min,这些函数接受可选的关键字参数,该参数必须是给定元素的函数,返回其排序键。maxsortedkey

这是一个从文件中提取1000条最长行的程序:

import heapq
with open(filename) as f:
    longest_lines = heapq.nlargest(1000, f, key=len)

在这里,我们打开文件,并将文件句柄传递f给nlargest。迭代文件将文件的每一行作为单独的字符串产生;nlargest然后将每个元素(或行)传递给函数,len以确定其排序键。len给定一个字符串,以字符为单位返回行的长度。

到目前为止只需要存储1000条最大行的列表即可,这可以与

longest_lines = sorted(f, key=len)[1000:]

这将不得不将整个文件保存在内存中