从可迭代中提取 N 个最大或 N 个最小项

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

import heapq

# get 5 largest items from the range

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

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

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

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

这是一个从文件中提取 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:]

这将必须将整个文件保存在内存中