2013-08-12 3 views
7

сказать, что я есть Dict вроде этого:питон ДИКТ, найти значение ближе всего к х

d = {'a': 8.25, 'c': 2.87, 'b': 1.28, 'e': 12.49} 

и у меня есть значение,

v = 3.19 

Я хочу сказать, что-то вроде:

x = "the key with the value CLOSEST to v" 

Который приведет к

x = 'c' 

Любые подсказки о том, как подойти к этому?

ответ

8

Использование min(iter, key=...)

target = 3.19 
key, value = min(dict.items(), key=lambda (_, v): abs(v - target)) 
+0

Python 3. Я думаю, что iteritems() заменено элементами(). Подтверждаете? – jason

+1

@jason: Yep, 2 '.items()' был удален и 2. '.iteritems()' был перемещен в '.items()' – Eric

+1

Люблю ламы - я имею в виду лямбды. :) Отлично. Благодаря! – yekta

2

Вы можете сделать это:

diff = float('inf') 
for key,value in d.items(): 
    if diff > abs(v-value): 
     diff = abs(v-value) 
     x = key 

print x 

который дает 'c'

Вы также можете использовать min сделать работу:

x = min(((key, abs(value-v)) for key,value in d.items()), key = lambda(k, v): v)[0] 
0

Вы могли бы сделать что-то вроде следующего:

d = {'a': 8.25, 'c': 2.87, 'b': 1.28, 'e': 12.49} 
v,l = 3.19,float('inf') 
for name,value in d.items(): 
    if abs(value-3.19) < l: 
     l = value-3.19 
     n = name 
print n 
+0

Это определенно не оправдывает второй цикл ... И почему бы не 'l = float ('inf')'? – Eric

+0

Благодарим вас за отзыв! Вы правы, это можно сделать легче с помощью одного цикла или лямбда. Кроме того, l = float ('inf') имеет больше смысла. – DrBailey

1

Не уверен, что вы хотите делать, если два значения одинаково далеко от цели, но если это когда-либо вопрос, вы могли бы использовать что-то вроде этого

min_diff = min(abs(v - target) for v in d.values()) 
closest_keys = [k for k, v in d.items() if abs(v - target) == min_diff] 
Смежные вопросы