从可迭代中提取 N 个最大或 N 个最小项
为了找到一个可迭代的最大或最小值的一定数目(不止一个),你可以使用 nlargest
和 nsmallest
的的 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 然后从结束或开始切片要高效得多。在内部,这些函数使用二进制堆 优先级队列数据结构,这对于此用例非常有效。
与 min
,max
和 sorted
一样,这些函数接受可选的 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:]
这将必须将整个文件保存在内存中。