找到与列表中给出的数字最接近的数字 ~ Python

Dhr*_*unt 2 python algorithm

与列表中给出的数字相比,您将如何找到最接近的数字?

这是我迄今为止尝试过的,但没有成功:

setted_list = [2, 9, 6, 20, 15]
value_chosen = 17

while True:
    final_value = setted_list[0]
    if setted_list[1] - value_chosen < setted_list[0] - value_chosen:
        final_value = setted_list[1]
    if setted_list[2] - value_chosen < setted_list[1] - value_chosen:
        final_value = setted_list[2]
    if setted_list[3] - value_chosen < setted_list[2] - value_chosen:
        final_value = setted_list[3]
    if setted_list[4] - value_chosen < setted_list[3] - value_chosen:
        final_value = setted_list[4]
print(final_value)
Run Code Online (Sandbox Code Playgroud)

我的输出始终是setted_list[2]. 我的算法哪里出错了?

小智 7

这是一个漂亮、干净、简单的单线:看看这个,你会希望学到一些新东西(@ OP)

print min(setted_list,
          key = lambda x: abs(x-value_chosen))
Run Code Online (Sandbox Code Playgroud)

min()这里并没有返回从minimalst值setted_list。现在的问题是什么minimalst转到key=说法。该lambda功能创建list()每个元件之间的差值setted_listvalue_chosen 最小值不是的返回值,min()而是最小值的索引用于返回 中的对应元素setted_list


Dad*_*dep 5

循环while True:永远不会break......你需要找到终点。

也许你想做这样的事情:

>>> l=max(setted_list)
>>> for i in setted_list:
...     if abs(i-value_chosen)<l:
...             l=abs(i-value_chosen)
...             final_value=i
... 
>>> final_value
15
Run Code Online (Sandbox Code Playgroud)

您还可以执行以下操作:

>>> setted_list = [2,9,6,20,15]
>>> value_chosen = 17
>>> min(setted_list, key=lambda x:abs(x-value_chosen))
15
Run Code Online (Sandbox Code Playgroud)

  • 这个循环对我来说似乎不正确,您需要首先初始化一个足够大的“min_distance”,在每次迭代时将其与每个差异“i-value_chosen”进行比较,并在每次找到更短的距离时更新它 (2认同)

Gin*_*ead 1

如果您还不太了解 lambda 函数,

   minimum = float("inf")
   setted_list = [2, 9, 6, 20, 15]
   value_chosen = 17

   for val in setted_list:
       if abs(val - value_chosen) < minimum:
           final_value = val
           minimum = abs(val - value_chosen)

            
   print final_value
Run Code Online (Sandbox Code Playgroud)