【问题标题】:For loop python, finding secons smallest number [duplicate]对于循环python,找到第二小的数字[重复]
【发布时间】:2014-11-07 13:39:01
【问题描述】:

我创建此代码是为了让用户输入一串整数。我正在尝试编写一个循环来查找列表中第二小的数字。我该如何完成?

numbers_input = raw_input('Insert numbers seperated by a space')
numbers_strings = numbers_input.split() 
numbers_list = map(int, numbers_strings)

for x in numbers_list:

【问题讨论】:

  • 为什么它必须是for 循环?为什么不heapq.nsmallest() 或简单的sorted(numbers_list)[1]
  • 告诉我们你尝试了什么?
  • 我正在练习循环
  • 向 Stack Overflow 寻求解决方案如何成为“实践”的好方法?至少老实说这是你的家庭作业,你需要使用 for 循环。

标签: python for-loop


【解决方案1】:

这就是heapq.nsmallest 的用途:

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

请注意,set(l) 用于删除重复索引!感谢 Jon Clements 在评论中提醒

您还可以使用sorted(iterable)[:n][1] 查找sorted(iterable)[:n] 为您提供n 个最小索引的第二小

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

source codensmallest

def nsmallest(n, iterable):
    """Find the n smallest elements in a dataset.

Equivalent to:  sorted(iterable)[:n]
"""
if n < 0:
    return []
it = iter(iterable)
result = list(islice(it, n))
if not result:
    return result
_heapify_max(result)
_heappushpop = _heappushpop_max
for elem in it:
    _heappushpop(result, elem)
result.sort()
return result

【讨论】:

  • 请注意,如果您将另一个 2 添加到该列表中,您将获得 2 作为第二小的数字 - 根据要求 - 这可能不是预期的结果。 .
  • @JonClements 对不起,我不明白你的意思?
  • 取决于是否需要第二低的唯一编号...
  • 哦,是的,谢谢提醒!所以我需要一个set
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 2018-09-22
  • 2021-06-18
  • 2012-04-01
  • 2017-12-26
相关资源
最近更新 更多