在 Python 字典中查找最接近的值并返回其键

yod*_*ish 11 python dictionary

我有一个价值

value = 0.04532
Run Code Online (Sandbox Code Playgroud)

另外,还有一本类似的字典

{'1': 0.02827, '2': 0.0, '3': 0.09827, '4': 0.04533}
Run Code Online (Sandbox Code Playgroud)

4在本例中,我只想返回字典中最接近原始值的值的键

我发现一个较旧的帖子做了类似的事情

newValue = value
answer = min(dict.items(), key=lambda (_, value): abs(value - newValue))
Run Code Online (Sandbox Code Playgroud)

这返回元组('4', 0.04533),我只想要键(作为 int)。此外,我无法理解该代码到底在做什么。

有没有更干净的方法来完成这项工作?

jpp*_*jpp 9

您可以使用序列解包来解包tuple结果:

value = 0.04532
d = {'1': 0.02827, '2': 0.0, '3': 0.09827, '4': 0.04533}

res_key, res_val = min(d.items(), key=lambda x: abs(value - x[1]))

print(res_key, res_val, sep=', ')

4, 0.04533
Run Code Online (Sandbox Code Playgroud)

一半的问题似乎出在你对变量的选择上。确保你没有隐藏类名,例如调用你的字典d,而不是dict。同样,不要将参数命名为lambda与已定义的变量相同的名称。

否则,逻辑via的min工作原理如下:

  1. 取出从 中提取的每个元组d.items,即键值对。
  2. 将函数lambda x: abs(value - x[1])应用于每个元组,即计算与 的绝对差value
  3. 计算函数的最小结果lambda并返回提供的参数,在本例中为单个 tuplefrom d.items

注意PEP 3113从 Python 3.x 中删除了元组参数解包,这就是为什么我们必须x[1]通过lambda.