需求:
快速的獲取乙個列表中最大/最小的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...