本系列來自python cookbook
思路
可以用最大(最小)堆。假設現在要找N個最大的元素,則首先把前N個元素入堆,并形成最小堆(堆頂元素為最小元素),下面每次有新元素來都和堆頂元素比較,如果小于等于堆頂元素則拋棄,否則刪除堆頂元素并將新元素入堆,并維持堆序。如此下去直到遍歷所有元素。
heapq模塊
heapq模塊中的nlargest()和nsmallest()兩個函數正好可以實現我們的需求
import heapq
users = [{'name': 'u2', 'age': 18},
{'name': 'coldplay', 'age': 19},
{'name': 'pink floyd', 'age': 25},
{'name': 'the door', 'age': 15},
{'name': 'eminem', 'age':40},
{'name': '2pac', 'age':50},
{'name': 'armstrong', 'age':60},
{'name': 'swift', 'age':25}
]
old5 = heapq.nlargest(5, users, key=lambda s : s['age'])
young5 = heapq.nsmallest(5, users, key=lambda s : s['age'])
print old5
print young5
別的方法
用operator.itemgetter可以自定義排序,排完后取最前或者最后的元素就可以了。