我有一个数字列表,我想给定特定值,以获取满足条件的列表中最接近的值。这是:最接近的值与值本身之间的差应小于0.5
我是lambda表达式的新手,所以可能是我不了解此函数的工作过程。我已基于此答案(复制)我的代码:from list of integers, get number closest to a given value
def min_in_limits(value,list):
new_val = min(list, key=lambda x: float(abs(float(x)-float(value)))<0.5)
return new_val
所以,当我输入这些信息时:
list = [9,11,13]
value = 8.9
函数min_in_limits返回11,而不是9
逐步评估时,lambda返回:
True, False, False
为什么会失败?
def less_elegant(value,list):
dictionary = {}
for i in list:
temp = float(abs(float(i)-float(value)))
if temp < 0.5:
dictionary.update({temp:i})
keys = dictionary.keys()
return(dictionary[min(keys)])
谢谢!
key
中的[min
]用于重新映射值。当前值传递给给定为key
的函数,并且在比较对象时使用其输出。如果将< 0.5
添加到该函数中,而不是将距离添加为数字,则将仅返回一个布尔标志,该布尔标志指示您的数字是否为close。您可以使用的是这个:
def min_in_limits(value, list_):
value = float(value) # if it is e.g. string
new_val = min(list_, key=lambda x: abs(float(x) - value))
if abs(new_val - value) < 0.5:
return new_val
return None
找到最小值后,检查它是否在0.5
的阈值之内,如果没有,则返回None。您应该传递
value
,即float
,而list_
是float
或int
的列表,在这种情况下,您可以删除value = float(value)
并将float(x)
替换为[ C0]。
此外,请勿将关键字(例如x
)用作变量/参数名称。