從可迭代中提取 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:]
這將必須將整個檔案儲存在記憶體中。