Python查詢最大或最小的 N 個元素

2021-09-25 12:38:59 字數 1491 閱讀 4784

(本文為python cookbook第三版1.4的內容)

怎樣從乙個集合中獲得最大或者最小的 n 個元素列表?

heapq 模組有兩個函式:nlargest()nsmallest()可以完美解決這個問題。

import heapq

nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]

print(heapq.nlargest(3, nums)) # prints [42, 37, 23]

print(heapq.nsmallest(3, nums)) # prints [-4, 1, 2]

兩個函式都能接受乙個關鍵字引數,用於更複雜的資料結構中:

portfolio = [,,

,,

,]cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])

expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])

譯者注:上面**在對每個元素進行對比的時候,會以price的值進行比較。

如果你想在乙個集合中查詢最小或最大的 n 個元素,並且 n 小於集合元素數量,那麼這些函式提供了很好的效能。 因為在底層實現裡面,首先會先將集合資料進行堆排序後放入乙個列表中:

>>> nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]

>>> import heapq

>>> heap = list(nums)

>>> heapq.heapify(heap)

>>> heap

[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]

>>>

堆資料結構最重要的特徵是heap[0]方法得到, 該方法會先將第乙個元素彈出來,然後用下乙個最小的元素來取代被彈出元素(這種操作時間複雜度僅僅是 o(log n),n 是堆大小)。 比如,如果想要查詢最小的 3 個元素,你可以這樣做:-41

2 當要查詢的元素個數相對比較小的時候,函式nlargest()nsmallest()是很合適的。 如果你僅僅想查詢唯一的最小或最大(n=1)的元素的話,那麼使用min()max()函式會更快些。 類似的,如果 n 的大小和集合大小接近的時候,通常先排序這個集合然後再使用切片操作會更快點 (sorted(items)[:n]或者是sorted(items)[-n:])。 需要在正確場合使用函式nlargest()nsmallest()才能發揮它們的優勢 (如果 n 快接近集合大小了,那麼使用排序操作會更好些)。

找到最大或最小的N個元素

在某個集合中找出 最大或最小的n個元素 heapq模組的nsmallest 和 nlargest是我們所需要的。如果只是找最大和最小max min更適合我們 更快 import heapq portfolio 可以接受key值 cheap heapq.nsmallest 3,portfolio,ke...

最小 或最大 表示法

題目 click 看插頭dp看到的記錄一下。問乙個迴圈的字串,也就是首尾相接的環形字串的字典序最小的運算元,每次可以把前面的乙個字元移動到尾部。定義兩個指標變數i 0,j 1,k 0表示以i或者j開始長度為k的字串。1 去比較s i k n 與s j k n 的大小 2 相等的話k 3 a 如果s ...

Python實用黑科技 找出最大 最小的n個元素

需求 快速的獲取乙個列表中最大 最小的n個元素。方法 最簡便的方法是使用heapq模組的兩個方法nlargest 和nsmallest 例如 in 1 import heapq in 2 nums 1,0,23,45,34,11,0,2,99,103,78 in 3 print heapq.nlar...