返回列表中的第三个最小元素?

时间:2017-03-03 01:42:16

标签: python python-2.7 list

我试图编写一个程序(在python2.7中),它接收一个整数列表并使用迭代返回列表中的第三个最小整数。如果有两个整数,则返回较高的整数。如果只有一个整数,则返回该整数。如果没有,则返回none。 我非常困惑,我不知道怎么写这个。我在这里尝试过: 更新版本:

s = raw_input("Enter your list:")
L = list(s)
sorted(L, key=int)
return [2]

if len(L) = [0:2]
return [1]

if len(L) = [0]
return 0

if len(L) = []
return none

但是,我对此有些困难。有关如何修改它以使其做我想要的任何建议吗?我知道堆函数,但我试图在不使用它的情况下编写它。非常感谢!

2 个答案:

答案 0 :(得分:1)

ShadowRanger是正确的。您应该使用heapq.nsmallest

import heapq

def third_smallest(x):
  return (heapq.nsmallest(3, x) or (None,))[-1]

如果您正在寻找高性能选项,那么使用heap的PriorityQueue实现可能是最好的。

构建堆应该花费O(n)时间,然后弹出前三个元素O(log n)。最终时间复杂度为O(n + log n),而使用排序O(n log n)。

您的解决方案如下所示:

import heapq

def third_smallest(x):
  heapq.heapify(n)
  value = None
  try:
    for i in range(3):
      value = heapq.heappop(n)
  except IndexError:
    pass
  return value

这可以合理地改进。

答案 1 :(得分:0)

尝试使用:

P1, P2, Q1