heapq.nlargest(n, iterable[, key])
从迭代器对象iterable中返回前n个最大的元素列表,其中关键字参数key用于匹配是字典对象的iterable,用于更复杂的数据结构中。
heapq.nsmallest(n, iterable[, key])
从迭代器对象iterable中返回前n个最小的元素列表,其中关键字参数key用于匹配是字典对象的iterable,用于更复杂的数据结构中。
这两个函数可以帮助我们在某个集合中找出最大或最小的N个元素。例如:
1 >>> import heapq 2 >>> nums=[1,8,2,23,7,-4,18,23,42,37,2] 3 >>> print(heapq.nlargest(3,nums)) 4 [42, 37, 23] 5 >>> print(heapq.nsmallest(3,nums)) 6 [-4, 1, 2]
7 student=[{'names':'CC','score':100,'height':189},
{'names':'BB','score':10,'height':169},
{'names':'AA','score':80,'height':179}]
8 print (heap.nsmallest(2,student,key=lambda x:x['height'])
>>{'names':'BB','score':10,'height':169},
{'names':'AA','score':80,'height':179}]
如果正在寻找最大或者最小的N个元素,且同集合中元素的总数目相比,N很小,那么下面这些函数就可以提供更好的性能。这些函数首先会在底层将数据转化成列表,且元素会以堆得顺序排列。例如:
1 nums=[1,8,2,23,7,-4,18,23,42,37,2] 2 import heapq 3 heap=list(nums) 4 heapq.heapify(heap)#将列表原地转换成堆 5 heap 6 >>>[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]
堆最重要的特性就是,heap[0]总是最小的那个元素,此外,接下来的最小元素可以一次通过heapq.heappop()的方法轻松的找到。该方法会将第一个元素(最小的)弹出,然后以第二小的元素取而代之。例如,要找到第三小的元素,可以这样做:
1 heapq.heappop(heap) 2 >>>-4 3 heapq.heappop(heap) 4 >>>1 5 heapq.heappop(heap) 6 >>>2 7 另外,heapq.heappush()的功能是把一项值压入堆,同时维持堆得排序要求。