從可迭代中提取 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:]

這將必須將整個檔案儲存在記憶體中