004找到最大或者最小的N个元素

heapq模块中的nlargestnsmallest可以很方便的解决这个问题。

  • nlargrst(int, [list|tuple|set|str])
  • 返回值类型 list
import heapq
numbers = [1, 2, 4, 6, -4, -3, -9, 9, 2, 8]
large_nums = heapq.nlargest(3, numbers)
small_nums = heapq.nsmallest(3, numbers)
print(f'large nums: {large_nums}')
print(f'small nums: {small_nums}')

<OUTPUT>
large nums: [9, 8, 6]
small nums: [-9, -4, -3]

nlargestnsmallest支持更加复杂的数据结构,接收参数key来声明将要处理的内容。

dict_in_list = [
    {'name': 'ws', 'age': 23},
    {'name': 'wfm', 'age': 31},
    {'name': 'scl', 'age': 28}
]
young = heapq.nlargest(2, dict_in_list, key=lambda s: s['age'])
elderly = heapq.nsmallest(2, dict_in_list, key=lambda s: s['age'])
print(f'young: {young}')
print(f'elderly: {elderly}')

<OUTPUT>
young: [{'name': 'wfm', 'age': 31}, {'name': 'scl', 'age': 28}]
elderly: [{'name': 'ws', 'age': 23}, {'name': 'scl', 'age': 28}]

可以使用heapify将列表转为堆,然后使用堆的特性来实现期望的功能;例如:堆的重要特性是heap[0]总是最小的元素。

heap = list(numbers)
# list -> heap(堆)
heapq.heapify(heap)print(f'heap: {heap}')

# 堆的重要特性是heap[0]总是最小的元素
# heapq.heappop()会将第一个元素(最小的)弹出,然后以第二小元素取而代之
print(heapq.heappop(heap))
print(heapq.heappop(heap))
print(heapq.heappop(heap))
print(heapq.heappop(heap))

<OUTPUT>
heap: [-9, -4, -3, 2, 2, 1, 4, 9, 6, 8]
-9
-4
-3
1

举例:找到最大的N个元素。

def search(lst: List, n: int):
    if n == 1:
        # 要找的元素只有一个时,max是最好的选择;当然,想要找最小的使用min
        return max(lst)
    elif n > (len(lst) * 0.9):
        # 要找的元素数量与序列长度相近时,先排序再切片效率会更高一些
        return sorted(lst)[:n]
    else:
        return heapq.nlargest(n, lst)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值