2013-08-12 10 views
7

कहने के लिए मैं इस तरह एक dict है लगता है:अजगर 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

पायथन 3. मुझे लगता है कि iteritems() आइटम() द्वारा प्रतिस्थापित किया गया है। की पुष्टि करें? – jason

+1

@ जेसन: हाँ, 2 का '.items() 'हटा दिया गया था, और 2' 'iteritems()' को '.items()' – Eric

+1

ले जाया गया था - मेरा मतलब है lambdas। :) यह भी खूब रही। धन्यवाद! – 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

के बजाय 'heapq.nsmallest' का उपयोग करें यह निश्चित रूप से एक दूसरा पाश को उचित नहीं ठहराता है ... और क्यों नहीं' l = float ('inf')'? – Eric

+0

आपकी प्रतिक्रिया के लिए धन्यवाद! आप सही हैं कि यह एक लूप या लैम्ब्डा के साथ अधिक आसानी से किया जा सकता है। इसके अलावा एल = फ्लोट ('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] 
संबंधित मुद्दे