【问题标题】:Return the THIRD smallest element in a list? [duplicate]返回列表中的第三个最小元素? [复制]
【发布时间】:2017-07-22 23:45:49
【问题描述】:

我正在尝试编写一个程序(在 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

但是,我在这方面遇到了一些困难。关于如何修改它以让它做我想做的任何建议?我知道堆函数,但我试图在不使用它的情况下编写它。非常感谢!

【问题讨论】:

  • 对列表进行排序,然后返回第三个,如果列表长度小于3则返回最后一个。
  • 您希望if s is (a, b): 做什么?您尚未分配变量ab。这是一个新列表,它永远不会与另一个列表相同。
  • 如果您想知道列表的长度,请使用if len(L) == 2:。为什么在函数中使用s 而不是L?为什么你返回sys.maxint 而不是更高的那个?
  • 您似乎根本没有真正考虑到这一点,您只是将随机代码放在一起。
  • 为了记录,在实际代码中,我会跳过排序以支持heapq.nsmallest,它只对O(k log n)起作用(其中k是要提取的最小项目的数量,并且n 是完整列表长度)而不是 O(n log n)。通过使用-1 对结果进行索引,您不需要列出大小为 1 或 2 的特殊情况;哎呀,你甚至可以变得聪明并做(heapq.nsmallest(3, L) or [None])[-1],这样你就可以无缝地处理空列表(以及无法预先检查长度的非列表输入)。

标签: python python-2.7 list


【解决方案1】:

尝试使用:

def thirdSmallest(L):
    # sort the list from smallest to largest
    L.sort()
    # select the 3rd element, or if less than 3 elements exists,
    # select the last one of the sorted list.  If the list is empty return None
    return (L[:3] or [None])[-1]

【讨论】:

  • 您只需要先对空列表进行特殊检查。
  • 您可以将非空情况简化为return L[:3][-1],它等效地处理 1、2 和 3+ 情况。或者更好的是,return (L[:3] or [None])[-1] 也可以处理空箱。
  • 这很聪明。我会更新的。
  • 在下面查看我的答案。 heapq.nsmallest 比对 n 的小值进行排序更有效。您还应该考虑使用(None,) 而不是[None],因为元组更轻且构建起来更快。
【解决方案2】:

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

这可能会得到改进。

【讨论】:

  • heapq.nsmallest 已经为您完成了这项工作;避免它制作的长度为三的列表的次要好处是无法重新实现它。
  • 哦,是的,文档甚至说它在较小的 n 值上表现最好。我还错过了 heap.nsmallest 等同于 sorted(iterable, key=key)[:n] 并且不确定它们是否会被订购。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多