अगर मेरे पास पायथन डिक्शनरी है, तो मुझे प्रवेश की कुंजी कैसे मिलेगी जिसमें न्यूनतम मूल्य शामिल है?
मैं min()समारोह के साथ कुछ करने के बारे में सोच रहा था ...
इनपुट दिया:
{320:1, 321:0, 322:3}
यह वापस आ जाएगी 321।
अगर मेरे पास पायथन डिक्शनरी है, तो मुझे प्रवेश की कुंजी कैसे मिलेगी जिसमें न्यूनतम मूल्य शामिल है?
मैं min()समारोह के साथ कुछ करने के बारे में सोच रहा था ...
इनपुट दिया:
{320:1, 321:0, 322:3}
यह वापस आ जाएगी 321।
जवाबों:
सर्वश्रेष्ठ: min(d, key=d.get)- बेकार lambdaअप्रत्यक्ष परत या वस्तुओं या कुंजियों को निकालने का कोई कारण नहीं !
[11, 22, 33]एक शब्दकोश जैसे "d" को एक उदाहरण के रूप में पारित कर चुके हैं {1: 11, 2:22, 3:33}। 'd.get' एक शब्दकोश के लिए मान्य है, लेकिन सूची के लिए नहीं।
d={"a":[10, None], "b":[20, None]}जहां मिनट की गणना d [कुंजी] [0] से की जाती है?
min()पहले मान में सॉर्ट किया गया मान वापस करें। कुंजी मानों को सॉर्ट करने का तरीका निर्दिष्ट करती है। key=d.getमतलब सूची को शब्दकोश के मूल्यों द्वारा क्रमबद्ध किया जाएगा।
यहाँ एक जवाब है जो वास्तव में ओपी द्वारा पूछे गए समाधान देता है:
>>> d = {320:1, 321:0, 322:3}
>>> d.items()
[(320, 1), (321, 0), (322, 3)]
>>> # find the minimum by comparing the second element of each tuple
>>> min(d.items(), key=lambda x: x[1])
(321, 0)
d.iteritems()हालांकि, बड़े शब्दकोशों के लिए उपयोग करना अधिक कुशल होगा।
operator.itemgetter(1)।
एकाधिक कुंजियों के लिए जिनका मूल्य सबसे कम है, आप सूची समझ का उपयोग कर सकते हैं:
d = {320:1, 321:0, 322:3, 323:0}
minval = min(d.values())
res = [k for k, v in d.items() if v==minval]
[321, 323]
एक समतुल्य कार्यात्मक संस्करण:
res = list(filter(lambda x: d[x]==minval, d))
>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k])
321
key=d.getबेहतर है।
उस मामले के लिए जहां आपके पास कई न्यूनतम कुंजी हैं और इसे सरल रखना चाहते हैं
def minimums(some_dict):
positions = [] # output variable
min_value = float("inf")
for k, v in some_dict.items():
if v == min_value:
positions.append(k)
if v < min_value:
min_value = v
positions = [] # output variable
positions.append(k)
return positions
minimums({'a':1, 'b':2, 'c':-1, 'd':0, 'e':-1})
['e', 'c']
यदि आप सुनिश्चित नहीं हैं कि आपके पास कई न्यूनतम मूल्य नहीं हैं, तो मैं सुझाव दूंगा:
d = {320:1, 321:0, 322:3, 323:0}
print ', '.join(str(key) for min_value in (min(d.values()),) for key in d if d[key]==min_value)
"""Output:
321, 323
"""
संपादित करें: यह न्यूनतम कुंजी के बारे में ओपी के मूल प्रश्न का उत्तर है, न कि न्यूनतम उत्तर।
आप keysफ़ंक्शन का उपयोग करके तानाशाह की चाबी प्राप्त कर सकते हैं , और आप minउस सूची के न्यूनतम का उपयोग करने के बारे में सही हैं ।
एक ही न्यूनतम मान के साथ कई कुंजियों के मुद्दे को संबोधित करने के लिए एक और दृष्टिकोण:
>>> dd = {320:1, 321:0, 322:3, 323:0}
>>>
>>> from itertools import groupby
>>> from operator import itemgetter
>>>
>>> print [v for k,v in groupby(sorted((v,k) for k,v in dd.iteritems()), key=itemgetter(0)).next()[1]]
[321, 323]
minएक इटरेटर के साथ उपयोग करें (अजगर 3 उपयोग के itemsबजाय iteritems); लैम्बडा के बजाय itemgetterऑपरेटर से उपयोग करें , जो लैम्ब्डा की तुलना में तेज है।
from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))
d={}
d[320]=1
d[321]=0
d[322]=3
value = min(d.values())
for k in d.keys():
if d[k] == value:
print k,d[k]
मैंने तुलना की कि निम्नलिखित तीन विकल्प कैसे प्रदर्शन करते हैं:
import random, datetime
myDict = {}
for i in range( 10000000 ):
myDict[ i ] = random.randint( 0, 10000000 )
# OPTION 1
start = datetime.datetime.now()
sorted = []
for i in myDict:
sorted.append( ( i, myDict[ i ] ) )
sorted.sort( key = lambda x: x[1] )
print( sorted[0][0] )
end = datetime.datetime.now()
print( end - start )
# OPTION 2
start = datetime.datetime.now()
myDict_values = list( myDict.values() )
myDict_keys = list( myDict.keys() )
min_value = min( myDict_values )
print( myDict_keys[ myDict_values.index( min_value ) ] )
end = datetime.datetime.now()
print( end - start )
# OPTION 3
start = datetime.datetime.now()
print( min( myDict, key=myDict.get ) )
end = datetime.datetime.now()
print( end - start )
नमूना उत्पादन:
#option 1
236230
0:00:14.136808
#option 2
236230
0:00:00.458026
#option 3
236230
0:00:00.824048
एक आदेश योग्य वर्ग बनाने के लिए आपको 6 विशेष कार्यों को ओवरराइड करना होगा, ताकि इसे मिनट () फ़ंक्शन द्वारा बुलाया जा सके
इन विधियों के __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__क्रम में वे कम से कम या बराबर, से अधिक, अधिक से अधिक या बराबर, बराबर, नहीं के बराबर हैं। उदाहरण के लिए आपको __lt__निम्नानुसार लागू करना चाहिए :
def __lt__(self, other):
return self.comparable_value < other.comparable_value
तो आप निम्न के रूप में न्यूनतम समारोह का उपयोग कर सकते हैं:
minValue = min(yourList, key=(lambda k: yourList[k]))
यह मेरे लिए काम किया।
min(zip(d.values(), d.keys()))[1]
मान और कुंजियों वाले टुपल्स का पुनरावृत्त बनाने के लिए ज़िप फ़ंक्शन का उपयोग करें। फिर इसे एक मिनी फ़ंक्शन के साथ लपेटें जो पहली कुंजी के आधार पर न्यूनतम लेता है। यह एक टपल युक्त (मान, की) जोड़ी देता है। संबंधित कुंजी पाने के लिए [1] के सूचकांक का उपयोग किया जाता है
# python
d={320:1, 321:0, 322:3}
reduce(lambda x,y: x if d[x]<=d[y] else y, d.iterkeys())
321
min()) में निर्मित कुछ को फिर से लागू करने की आवश्यकता नहीं है ।
क्या यह वही है जिसको तुम खोज रहे हो?
d = dict()
d[15.0]='fifteen'
d[14.0]='fourteen'
d[14.5]='fourteenandhalf'
print d[min(d.keys())]
प्रिंट 'चौदह'