我试图编写一个程序(在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
但是,我对此有些困难。有关如何修改它以使其做我想要的任何建议吗?我知道堆函数,但我试图在不使用它的情况下编写它。非常感谢!
答案 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