Python 在某个集合中找出最大或最小的N个元素

需求:在在某个集合中找出最大或最小的3个元素

import heapq

nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]	#可以是列表、集合、元组、字典(比较key的值)
print(heapq.nlargest(3, nums))			#前3个最大的元素
print(heapq.nlargest(3, nums))			#前3个最小的元素

类似max和min函数,nlargest和nlargest 也可以接受一个key,使其工作在复杂的数据结构上:

#选出最便宜和最贵的前3支股票信息
portfolio = [
    {'name':'IBM', 'shares':100, 'price':91.1},
    {'name':'AAPL', 'shares':50, 'price':21.09},
    {'name':'FB', 'shares':200, 'price':31.75},
    {'name':'HPQ', 'shares':35, 'price':16.35},
    {'name':'YHOO', 'shares':45, 'price':115.65},
    {'name':'ACME', 'shares':75, 'price':543.22}
]

cheap = heapq.nsmallest(3, portfolio, key=lambda s:s['price'])
expensive = heapq.nlargest(3, portfolio, key=lambda s:s['price'])

#输出结果如下:
In [88]: print(cheap)
[{'name': 'HPQ', 'shares': 35, 'price': 16.35}, {'name': 'AAPL', 'shares': 50, 'price': 21.09}, {'name': 'FB', 'shares': 200, 'price': 31.75}]

In [89]: print(expensive)
[{'name': 'ACME', 'shares': 75, 'price': 543.22}, {'name': 'YHOO', 'shares': 45, 'price': 115.65}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]

如果正在寻找最大或最小的N个元素,这个N个元素相对于集合中的总数占比很小,那么下面这些函数可以提供更好的性能。


nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
import heapq
heap = list(nums)
heapq.heapify(heap)
heap[0] 					#总是取最小的元素,但不是说for i in heap 就是以此从小到大进行遍历

heapq.heappop(heap)			#按照大小从小到大弹出元素,复杂度 O(logN),N代表堆的大小

for _ in range(len(heaq)):	#从小到大打印序列
    print(heapq.heappop(heap))

当所找的元素数量相对较小时,函数nlargest() 和 nsmallest() 才最实用;如果只是想单纯的找到最大或者最小元素,即N=1时,那么min() 和 max()会更快。同样,如果N和集合本身的大小差不多大,更快的方法是先排序,再切片,如:sorted(items)[:N]

你可能感兴趣的:(Python)