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

2021-08-07 10:56:27 字數 1343 閱讀 2058

需求:

快速的獲取乙個列表中最大/最小的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.nlargest(3, nums))

[103, 99, 45]

in [4]: print(heapq.nsmallest(3, nums))

[-78, -23, -11]

這兩個方法還可以根據具體的key值來獲取複雜資料結構的結果, 例如:

in [5]: computers = [

...: ,

...: ,

...: ,

...: ,

...:

...: ]

in [6]: cheap = heapq.nsmallest(4, computers, key=lambda s:s['price'])

in [7]: expensive = heapq.nlargest(4, computers, key=lambda s:s['price'])

in [8]: cheap

out[8]:

[, ,

, ]in [9]: expensive

out[9]:

, ,]

擴充套件:

可以看出這兩個方法對於找出n個最大/最小值的方便,從本質上看,其實呼叫模組heapq的左右就是返回乙個排序堆構成的列表:

in [10]: nums = [1, 3, 5, -4, 18, -23, 0, 9, -6, 11]

in [11]: heap = list(nums)

in [12]: heapq.heapify(heap)

in [13]: heap

out[13]: [-23, -6, 0, -4, 11, 5, 1, 9, 3, 18]

out[14]: -23

out[15]: -6

out[16]: -4

當然,如果要選擇最大/最小的1個元素(n=1,其實就是最大最小值),使用min(), max()自然更快。此外,對於獲取n個元素,直接採用sorted(items)[:n]或者sorted(items)[-n:]也是方便快捷的。雖然替代方法不少,但是對於堆得使用確實很有意思的,有興趣的讀者可以繼續研究它的底層實現。同樣,對於heapq這個模組的使用可以參考heapq官方文件

Python實用黑科技 以某個字段進行分組

需求 當前有個字典例項,你想以某個字段比如 日期 對整個字典裡面的元素進行分組。方法 itertools.groupby 函式是專門用來幹這個活的。請看下面這個例子,這裡有乙個列表構成的字典,你想按照日期來對列表進行分組,可以這麼做 in 42 from operator import itemge...

Python黑科技 賦值技巧

乙個變數乙個值 正常賦值 v 1 結果,v 1 多個變數乙個值 連續賦值 x y z 0 結果,x 0,y 0,z 0 注意 所賦值不要是可變物件 x y z python的變數名只是代號 x y z 都指向同乙個 x 變化時,y 和 z 也會變化 乙個變數多個值 序列打包 t 1,2,3 首先,p...

各種實用的模板和黑科技(緩更)

這個部落格是記錄我的各種模板和黑科技,遇到有關就更新乙個點。1.spfa q.push st while q.size vis now false 這個模板的核心就是用了優先佇列,充分發揮了優先佇列的存放特點。2.堆排序 include include include include using n...