与列表中给出的数字相比,您将如何找到最接近的数字?
这是我迄今为止尝试过的,但没有成功:
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_list和value_chosen。
最小值不是的返回值,min()而是最小值的索引用于返回 中的对应元素setted_list。
循环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)
如果您还不太了解 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)