2013-08-12 74 views
7

nói rằng tôi có một dict như thế này:python dict, tìm giá trị gần nhất với x

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

và tôi có một giá trị

v = 3.19 

Tôi muốn nói điều gì đó như:

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

Điều này sẽ dẫn đến

x = 'c' 

Bất kỳ gợi ý về cách tiếp cận này?

Trả lời

8

Sử dụng min(iter, key=...)

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

Python 3. tôi nghĩ iteritems() đã được thay thế bằng mặt hàng(). Xác nhận? – jason

+1

@ jason: Yep, '.items()' đã được loại bỏ, và '.iteritems()' của 2 đã được chuyển sang '.items()' – Eric

+1

Yêu thích các Lạt ma - ý tôi là lambdas. :) Điều đó thật tuyệt. Cảm ơn! – yekta

2

Bạn có thể làm điều này:

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

print x 

mang đến cho 'c'

Bạn cũng có thể sử dụng min để thực hiện công việc:

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

Bạn có thể làm một cái gì đó như sau:

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

Điều này chắc chắn không biện minh cho vòng lặp thứ hai ... Và tại sao không 'l = float ('inf')'? – Eric

+0

Cảm ơn bạn đã phản hồi! Bạn nói đúng điều này có thể được thực hiện dễ dàng hơn với một vòng lặp đơn hoặc lambda. Ngoài ra l = float ('inf') có ý nghĩa hơn. – DrBailey

1

Không chắc chắn những gì bạn muốn nó làm gì nếu hai giá trị là như nhau xa mục tiêu, nhưng nếu đó là bao giờ là một vấn đề, bạn có thể sử dụng giống như

này
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] 
Các vấn đề liên quan