怎样从一个集合中获得最大或者最小的 N 个元素列表?对于熟悉python的人来说,解决这个问题的方法十分简单。
即使用heapq
模块。
heapq 模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题。
import heapq
import random
num = [random.randint(10, 1000) for i in range(10)]
print(num)
print(heapq.nlargest(3, num))
print(heapq.nsmallest(3, num))
测试输出如下:
[726, 180, 357, 781, 209, 177, 926, 666, 86, 254]
[926, 781, 726]
[86, 177, 180]
这样就可以得出一个列表中最大和最小的三个数。
当然他的应用不止于此,还可以与lambda函数结合使用,用于处理更复杂的数据结构。
import heapq
# 用于美化输出字典
import pprint
test_dict = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'APPLE', 'shares': 50, 'price': 543.22},
{'name': 'DELL', 'shares': 200, 'price': 21.09},
{'name': "GOOGLE', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
]
cheap = heapq.nsmallest(3, test_dict , key=lambda s: s['price'])
expensive = heapq.nlargest(3, test_dict , key=lambda s: s["price"])
pprint.pprint(cheap)
pprint.pprint(expensive)
得到输出结果如下:
[{'name': 'YHOO', 'price': 16.35, 'shares': 45},
{'name': 'DELL', 'price': 21.09, 'shares': 200},
{'name': 'GOOGLE', 'price': 31.75, 'shares': 35}]
[{'name': 'APPLE', 'price': 543.22, 'shares': 50},
{'name': 'ACME', 'price': 115.65, 'shares': 75},
{'name': 'IBM', 'price': 91.1, 'shares': 100}]
这样就得到了列表中价格最小和价格最大的三个字典元素。