本系列来自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可以自定义排序,排完后取最前或者最后的元素就可以了。
网友评论