【问题标题】:Find second smallest integer (python) [duplicate]查找第二小的整数(python)[重复]
【发布时间】:2014-11-06 17:44:39
【问题描述】:

除了 sort() 之外,还有没有其他方法可以找到该行中第二小的整数:

10 12 2 5 15 

【问题讨论】:

  • sorted('10 12 2 5 15'.split(),reverse=True)[1]
  • 排序绝对不是最好的方法,因为它对整个列表进行排序 - 这是浪费。
  • @will 除非您针对您的确切用例评估性能并意外地发现这是最有效的方法。
  • 排序是否更有效无关紧要,因为问题要求排序的替代方法。
  • @moooeeeep 没有排序,你只需要遍历列表一次,所以如果列表很长,那么对它进行排序并获取第二个条目将是一个不好的技术。这需要多长时间取决于相对速度,尽管sort() 是用c 编写的,所以在python 实现接管之前需要一段时间。对于random.shuffle()'d range(length) 列表,至少在我的机器上,它必须有大约 200000 个元素,才能让天真的纯 python 方法击败它。

标签: python sorting


【解决方案1】:

你可以使用heapq.nsmalles

>>> import heapq
>>> l=[10, 12, 2, 5 ,15]
>>> print(heapq.nsmallest(2, l)) [1]
5

堆最重要的特性是heap[0] 始终是最小的项。更多的- 结束后,可以使用heapq.heappop() 方法轻松找到后续项目,该方法 弹出第一个项目并将其替换为下一个最小的项目(一个操作 需要 O(log N) 次操作,其中 N 是堆的大小)

nlargest()nsmallest() 函数最适合您尝试 找到数量相对较少的项目。如果你只是想找到一个最小的 或最大项(N=1),使用 min()max() 更快。同样,如果 N 大约是 与集合本身大小相同,通常先对其进行排序并获取切片(即, 使用 sorted(items)[:N]sorted(items)[-N:] )。需要注意的是,实际 nlargest()nsmallest() 的实现在其操作方式和将 代表您执行其中一些优化(例如,如果 N 接近,则使用排序 与输入的大小相同)。 (参考:python cookbook 3rd edition

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2019-08-05
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多