• heapq模块中的两个函数——nlargest()和nsmallest()


     

    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()的功能是把一项值压入堆,同时维持堆得排序要求。
  • 相关阅读:
    [姿势] 关于Ubuntu16.04安装前后
    [题解] poj 1716 Integer Intervals (差分约束+spfa)
    [题解] hdu 2433 Travel (BFS)
    [题解] poj 3169 Layout (差分约束+bellmanford)
    [题解] poj 3660 Cow Contest (floyd)
    [题解] hdu 1142 A Walk Through the Forest (dijkstra最短路 + 记忆化搜索)
    [题解] poj 1724 ROADS (dijkstra最短路+A*搜索)
    [BZOJ1491][NOI2007]社交网络 floyd
    [BZOJ2064]分裂 状压dp
    [BZOJ3585]mex 主席树
  • 原文地址:https://www.cnblogs.com/zhanghongpan/p/12627471.html
Copyright © 2020-2023  润新知