查找最大或最小的N个元素

  • 原创
  • Madman
  • /
  • /
  • 0
  • 1662 次阅读

Synopsis: 如果只想查找最小或最大的元素的话(N=1),请使用 min() 或 max() 函数;如果 N 的大小和容器大小接近的时候,通常先排序这个容器然后再使用切片操作会更快点( sorted(items)[:N] 或者是 sorted(items)[-N:] );当要查找的元素个数相对比较小的时候(N大于1,且N小于容器元素数量),使用 heapq 模块中的 nsmallest() 和 nlargest() 函数是最合适的。需要在正确场合使用函数 nlargest() 和 nsmallest() 才能发挥它们的优势 (如果 N 快接近容器大小了,那么使用排序操作会更好些)

1. N=1时

如果只想查找最小或最大的元素的话,请使用min()max()函数:

In [1]: nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]

In [2]: min(nums)
Out[2]: -4

In [3]: max(nums)
Out[3]: 42

这两个函数也支持指定key=func来实现自定义的排序:

In [1]: portfolio = [
   ...:     {'name': 'IBM', 'shares': 100, 'price': 91.1},
   ...:     {'name': 'AAPL', 'shares': 50, 'price': 543.22},
   ...:     {'name': 'FB', 'shares': 200, 'price': 21.09},
   ...:     {'name': 'HPQ', 'shares': 35, 'price': 31.75},
   ...:     {'name': 'YHOO', 'shares': 45, 'price': 16.35},
   ...:     {'name': 'ACME', 'shares': 75, 'price': 115.65}
   ...: ]

In [2]: max(portfolio)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-5f0359b97ec9> in <module>()
----> 1 max(portfolio)

TypeError: '>' not supported between instances of 'dict' and 'dict'

In [3]: max(portfolio, key=lambda x: x['price'])
Out[3]: {'name': 'AAPL', 'shares': 50, 'price': 543.22}

In [4]: min(portfolio, key=lambda x: x['price'])
Out[4]: {'name': 'YHOO', 'shares': 45, 'price': 16.35}

2. N接近容器的总大小时

这个时候最优的方案是,先排序这个容器,然后使用切片操作会更快点:

In [1]: nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]

In [2]: sorted(nums)[:
                                
                            
未经允许不得转载: LIFE & SHARE - 王颜公子 » 查找最大或最小的N个元素

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

0 条评论

暂时还没有评论.