【问题标题】:How to find the smallest closest number in a list in python如何在python的列表中找到最小的最接近的数字
【发布时间】:2017-03-09 08:48:23
【问题描述】:

我想知道如何在列表中找到与给定数字最接近的最小数字。 例如:

number = 20

list_of_numbers = [4, 9, 15, 25]

我试过了:

min(list_of_numbers, key=lambda x:abs(x-number))

输出是 25 而不是 15。问题是它总是给我“最接近的最大”而不是“最接近的最小”。

【问题讨论】:

  • 嗯我测试了你的方法它在 Python 3.5.2 和 2.7 中给了我 15
  • 2.7 也给了我 15 个
  • @Blender 它是 Python 2.1.1
  • 2.1.1?你是 2000 年的时间旅行者吗?
  • @KazeRyuga 如果它真的是 2.1.1,那么我不确定接受的答案将如何帮助你——key 在 Python 2.1.1 和 sorted() 中都不存在。跨度>

标签: python list numbers


【解决方案1】:

不是这个

min(list_of_numbers, key=lambda x:abs(x-number))
 

试试这个:

number = 20
list_of_numbers = [4, 9, 15, 25]
list_of_numbers.sort(reverse=True)
min(list_of_numbers,key=lambda x : x - number > 0 )

【讨论】:

    【解决方案2】:

    将数字列表中的数字添加到键中,以便将其考虑在内。

    min(list_of_numbers, key=lambda x: (abs(x - number), x))
    

    此外,如果您想要列表中与要求匹配的 first 数字,请将索引添加到键中:

    min(enumerate(list_of_numbers), key=lambda ix: (abs(ix[1] - number), ix[0]))[1]
    

    虽然这仅在Python 2 下需要,因为Python 3 保证:

    如果多个项目是最小的,该函数返回遇到的第一个。这与sorted(iterable, key=keyfunc)[0]heapq.nsmallest(1, iterable, key=keyfunc) 等其他排序稳定性保持工具一致。

    【讨论】:

      【解决方案3】:

      您可以让key 也包含数字本身并使用它来打破平局:

      min(list_of_numbers, key=lambda x: (abs(x - number), x))
      

      不过,你的行为很奇怪。这可能是一个错误。您也许可以通过使用稳定的sorted 来解决它:

      sorted(list_of_numbers, key=lambda x: abs(x - number))[0]
      

      【讨论】:

      • 依赖于顺序,用 [4,9,25,15] 测试原始我得到 25 而 [4,9,15,25] 给出 15,因此它返回第一个在 python 3.5 和 2.7 中找到,也许在 python 2.1 中是它返回的最后一个
      • @Copperfield, Python 3 (>=3.2) 保证返回第一个项目,Python 2 不会。
      • @CristianCiupitu 这只是 Python 2.7 的一个文档问题。
      • @AshwiniChaudhary,只是文档问题?!错误报告在哪里? :-) 如果它不在文档中,则它不存在。由于程序员滥用无证行为,人们很难让旧程序在新系统上运行。 Microsoft 可能浪费了大量资源来尝试保持与旧软件的兼容性。
      • @CristianCiupitu 并非所有对 Python 3 所做的更改都适用于 Python 2.7。与 Microsoft 不同,这里没有任何封闭源代码,您可以随时检查源代码以确定。 :-) 相关问题:bugs.python.org/issue9802
      猜你喜欢
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2018-01-02
      • 1970-01-01
      相关资源
      最近更新 更多