दिलचस्प पोस्ट
बूटस्ट्रैप 3: कॉलम केवल छोटे स्क्रीन आकारों पर पुश / पुल करें AsyncTask का उपयोग करना दो कॉलम द्वारा PHP MySQL ऑर्डर कैसे "304 संशोधित नहीं" काम करता है? जावा में एक प्रक्रिया को मारने के लिए, एक विशिष्ट पीआईडी ​​को दिए सक्रिय बच्चे के माता-पिता के लिए जटिल सीएसएस चयनकर्ता कैसे पृष्ठभूमि की ऊंचाई को समायोजित करने के लिए div ऊंचाई पाने के लिए? स्टैक किए गए पैनल नियंत्रणों को प्रबंधित करने के लिए TabControl बटन छिपाएं अनदेखा अपवाद: यह क्लास कुंजी मान कोडन-अनुरूप नहीं है स्थानीय नेटवर्क उपयोगकर्ताओं को मेरी WAMP साइटों तक पहुंचने के लिए कैसे सक्षम करें? फ़ंक्शन पैरामीटर के लिए 'const' का उपयोग करें jQuery के पृष्ठ पर अंक लगाना प्लगइन दस्तावेज़ के विकल्प क्या हैं? लिखिए? स्थानांतरित कंटेनर का पुन: उपयोग? नए उपयोगकर्ता के निर्माण पर उपयोगकर्ता नाम और यादृच्छिक पासवर्ड के साथ ईमेल की स्वत: पीढ़ी

शब्दकोश में अधिकतम मूल्य के साथ कुंजी हो रही है?

मेरे पास एक dictionary : कुंजी स्ट्रिंग हैं, मान पूर्णांक हैं

उदाहरण:

 stats = {'a':1000, 'b':3000, 'c': 100} 

मैं 'b' को एक उत्तर के रूप में प्राप्त करना चाहता हूं, क्योंकि यह एक उच्च मूल्य के साथ की कुंजी है

उलट कुंजी-मूल्य ट्यूपल्स के साथ एक मध्यवर्ती सूची का उपयोग करते हुए मैंने निम्न किया है:

 inverse = [(value, key) for key, value in stats.items()] print max(inverse)[1] 

क्या यह एक बेहतर (या अधिक सुंदर) दृष्टिकोण है?

वेब के समाधान से एकत्रित समाधान "शब्दकोश में अधिकतम मूल्य के साथ कुंजी हो रही है?"

आप इसके लिए operator.itemgetter उपयोग कर सकते हैं:

 import operator stats = {'a':1000, 'b':3000, 'c': 100} max(stats.iteritems(), key=operator.itemgetter(1))[0] 

और मेमोरी उपयोग stats.iteritems() में एक नई सूची बनाने के बजाय। max() फ़ंक्शन के लिए key पैरामीटर एक ऐसा कार्य है जो आइटम को रैंक करने का तरीका निर्धारित करने के लिए उपयोग की जाने वाली एक कुंजी की गणना करता है

कृपया ध्यान दें कि यदि आपके पास एक अन्य महत्वपूर्ण-मूल्य जोड़ी 'डी' है: 3000, यह विधि केवल दो में से एक को लौटाएगा, हालांकि दोनों में अधिकतम मूल्य होगा।

 >>> import operator >>> stats = {'a':1000, 'b':3000, 'c': 100, 'd':3000} >>> max(stats.iteritems(), key=operator.itemgetter(1))[0] 'b' 
 max(stats, key=stats.get) 

मैंने कई रूपों का परीक्षण किया है, और यह अधिकतम मूल्य के साथ डिक्ट की कुंजी को वापस करने का सबसे तेज़ तरीका है:

 def keywithmaxval(d): """ a) create a list of the dict's keys and values; b) return the key with the max value""" v=list(d.values()) k=list(d.keys()) return k[v.index(max(v))] 

आपको एक विचार देने के लिए, यहां कुछ उम्मीदवार तरीके हैं:

 def f1(): v=list(d1.values()) k=list(d1.keys()) return k[v.index(max(v))] def f2(): d3={v:k for k,v in d1.items()} return d3[max(d3)] def f3(): return list(filter(lambda t: t[1]==max(d1.values()), d1.items()))[0][0] def f3b(): # same as f3 but remove the call to max from the lambda m=max(d1.values()) return list(filter(lambda t: t[1]==m, d1.items()))[0][0] def f4(): return [k for k,v in d1.items() if v==max(d1.values())][0] def f4b(): # same as f4 but remove the max from the comprehension m=max(d1.values()) return [k for k,v in d1.items() if v==m][0] def f5(): return max(d1.items(), key=operator.itemgetter(1))[0] def f6(): return max(d1,key=d1.get) def f7(): """ a) create a list of the dict's keys and values; b) return the key with the max value""" v=list(d1.values()) return list(d1.keys())[v.index(max(v))] def f8(): return max(d1, key=lambda k: d1[k]) tl=[f1,f2, f3b, f4b, f5, f6, f7, f8, f4,f3] cmpthese.cmpthese(tl,c=100) 

परीक्षण शब्दकोश:

 d1={1: 1, 2: 2, 3: 8, 4: 3, 5: 6, 6: 9, 7: 17, 8: 4, 9: 20, 10: 7, 11: 15, 12: 10, 13: 10, 14: 18, 15: 18, 16: 5, 17: 13, 18: 21, 19: 21, 20: 8, 21: 8, 22: 16, 23: 16, 24: 11, 25: 24, 26: 11, 27: 112, 28: 19, 29: 19, 30: 19, 3077: 36, 32: 6, 33: 27, 34: 14, 35: 14, 36: 22, 4102: 39, 38: 22, 39: 35, 40: 9, 41: 110, 42: 9, 43: 30, 44: 17, 45: 17, 46: 17, 47: 105, 48: 12, 49: 25, 50: 25, 51: 25, 52: 12, 53: 12, 54: 113, 1079: 50, 56: 20, 57: 33, 58: 20, 59: 33, 60: 20, 61: 20, 62: 108, 63: 108, 64: 7, 65: 28, 66: 28, 67: 28, 68: 15, 69: 15, 70: 15, 71: 103, 72: 23, 73: 116, 74: 23, 75: 15, 76: 23, 77: 23, 78: 36, 79: 36, 80: 10, 81: 23, 82: 111, 83: 111, 84: 10, 85: 10, 86: 31, 87: 31, 88: 18, 89: 31, 90: 18, 91: 93, 92: 18, 93: 18, 94: 106, 95: 106, 96: 13, 9232: 35, 98: 26, 99: 26, 100: 26, 101: 26, 103: 88, 104: 13, 106: 13, 107: 101, 1132: 63, 2158: 51, 112: 21, 113: 13, 116: 21, 118: 34, 119: 34, 7288: 45, 121: 96, 122: 21, 124: 109, 125: 109, 128: 8, 1154: 32, 131: 29, 134: 29, 136: 16, 137: 91, 140: 16, 142: 104, 143: 104, 146: 117, 148: 24, 149: 24, 152: 24, 154: 24, 155: 86, 160: 11, 161: 99, 1186: 76, 3238: 49, 167: 68, 170: 11, 172: 32, 175: 81, 178: 32, 179: 32, 182: 94, 184: 19, 31: 107, 188: 107, 190: 107, 196: 27, 197: 27, 202: 27, 206: 89, 208: 14, 214: 102, 215: 102, 220: 115, 37: 22, 224: 22, 226: 14, 232: 22, 233: 84, 238: 35, 242: 97, 244: 22, 250: 110, 251: 66, 1276: 58, 256: 9, 2308: 33, 262: 30, 263: 79, 268: 30, 269: 30, 274: 92, 1300: 27, 280: 17, 283: 61, 286: 105, 292: 118, 296: 25, 298: 25, 304: 25, 310: 87, 1336: 71, 319: 56, 322: 100, 323: 100, 325: 25, 55: 113, 334: 69, 340: 12, 1367: 40, 350: 82, 358: 33, 364: 95, 376: 108, 377: 64, 2429: 46, 394: 28, 395: 77, 404: 28, 412: 90, 1438: 53, 425: 59, 430: 103, 1456: 97, 433: 28, 445: 72, 448: 23, 466: 85, 479: 54, 484: 98, 485: 98, 488: 23, 6154: 37, 502: 67, 4616: 34, 526: 80, 538: 31, 566: 62, 3644: 44, 577: 31, 97: 119, 592: 26, 593: 75, 1619: 48, 638: 57, 646: 101, 650: 26, 110: 114, 668: 70, 2734: 41, 700: 83, 1732: 30, 719: 52, 728: 96, 754: 65, 1780: 74, 4858: 47, 130: 29, 790: 78, 1822: 43, 2051: 38, 808: 29, 850: 60, 866: 29, 890: 73, 911: 42, 958: 55, 970: 99, 976: 24, 166: 112} 

और पायथन 3.2 के तहत परीक्षण के परिणाम:

  rate/sec f4 f3 f3b f8 f5 f2 f4b f6 f7 f1 f4 454 -- -2.5% -96.9% -97.5% -98.6% -98.6% -98.7% -98.7% -98.9% -99.0% f3 466 2.6% -- -96.8% -97.4% -98.6% -98.6% -98.6% -98.7% -98.9% -99.0% f3b 14,715 3138.9% 3057.4% -- -18.6% -55.5% -56.0% -56.4% -58.3% -63.8% -68.4% f8 18,070 3877.3% 3777.3% 22.8% -- -45.4% -45.9% -46.5% -48.8% -55.5% -61.2% f5 33,091 7183.7% 7000.5% 124.9% 83.1% -- -1.0% -2.0% -6.3% -18.6% -29.0% f2 33,423 7256.8% 7071.8% 127.1% 85.0% 1.0% -- -1.0% -5.3% -17.7% -28.3% f4b 33,762 7331.4% 7144.6% 129.4% 86.8% 2.0% 1.0% -- -4.4% -16.9% -27.5% f6 35,300 7669.8% 7474.4% 139.9% 95.4% 6.7% 5.6% 4.6% -- -13.1% -24.2% f7 40,631 8843.2% 8618.3% 176.1% 124.9% 22.8% 21.6% 20.3% 15.1% -- -12.8% f1 46,598 10156.7% 9898.8% 216.7% 157.9% 40.8% 39.4% 38.0% 32.0% 14.7% -- 

और पायथन 2.7 के अंतर्गत:

  rate/sec f3 f4 f8 f3b f6 f5 f2 f4b f7 f1 f3 384 -- -2.6% -97.1% -97.2% -97.9% -97.9% -98.0% -98.2% -98.5% -99.2% f4 394 2.6% -- -97.0% -97.2% -97.8% -97.9% -98.0% -98.1% -98.5% -99.1% f8 13,079 3303.3% 3216.1% -- -5.6% -28.6% -29.9% -32.8% -38.3% -49.7% -71.2% f3b 13,852 3504.5% 3412.1% 5.9% -- -24.4% -25.8% -28.9% -34.6% -46.7% -69.5% f6 18,325 4668.4% 4546.2% 40.1% 32.3% -- -1.8% -5.9% -13.5% -29.5% -59.6% f5 18,664 4756.5% 4632.0% 42.7% 34.7% 1.8% -- -4.1% -11.9% -28.2% -58.8% f2 19,470 4966.4% 4836.5% 48.9% 40.6% 6.2% 4.3% -- -8.1% -25.1% -57.1% f4b 21,187 5413.0% 5271.7% 62.0% 52.9% 15.6% 13.5% 8.8% -- -18.5% -53.3% f7 26,002 6665.8% 6492.4% 98.8% 87.7% 41.9% 39.3% 33.5% 22.7% -- -42.7% f1 45,354 11701.5% 11399.0% 246.8% 227.4% 147.5% 143.0% 132.9% 114.1% 74.4% -- 

आप देख सकते हैं कि f1 पायथन 3.2 और 2.7 (या अधिक पूरी तरह से, इस पोस्ट के शीर्ष पर keywithmaxval साथ-साथ) के तहत सबसे तेज़ है

यहाँ एक और है:

 stats = {'a':1000, 'b':3000, 'c': 100} max(stats.iterkeys(), key=lambda k: stats[k]) 

फ़ंक्शन key केवल वह मान देता है जो रैंकिंग के लिए उपयोग किया जाना चाहिए और max() मांग तत्व को तुरंत वापस देता है

यदि आपको अधिकतम मूल्य के साथ केवल एक चाबी जानना आवश्यक है जिसे आप बिना iterkeys या iteritems बिना कर सकते हैं क्योंकि पायथन में शब्दकोश के माध्यम से पुनरावृत्ति इसकी कुंजी के माध्यम से चलना है

 max_key = max(stats, key=lambda k: stats[k]) 

संपादित करें:

टिप्पणियों से, @ user1274878:

मैं अजगर के लिए नया हूँ क्या आप कृपया अपना जवाब चरण में बता सकते हैं?

हां…

अधिकतम

मैक्स (इटरेबल [, कुंजी])

अधिकतम (arg1, arg2, * आर्ग्स [, कुंजी])

एक सबसे अधिक आइटम को एक पुनरावृत्ति या दो या अधिक तर्कों में से सबसे बड़ा लौटाएं।

वैकल्पिक key तर्क उनके बीच अधिकतम प्राप्त करने के लिए तत्वों की तुलना करने का वर्णन करता है:

 lambda <item>: return <a result of operation with item> 

लौटाए गए मूल्यों की तुलना की जाएगी।

dict

पायथन डिक्ट एक हैश तालिका है एक कुंजी की एक कुंजी एक वस्तु के एक हैश है जिसे एक कुंजी के रूप में घोषित किया गया है निष्पादन कारणों की वजह से चलने के कारण एक शब्दकोश द्वारा इसकी कुंजी के माध्यम से पुनरावृत्ति के रूप में लागू किया गया था

इसलिए हम इसका उपयोग कुंजी की सूची प्राप्त करने के लिए छुटकारा पाने के लिए कर सकते हैं।

समापन

किसी अन्य फ़ंक्शन के अंदर परिभाषित फ़ंक्शन को नेस्टेड फ़ंक्शन कहा जाता है नेस्टेड फ़ंक्शंस समेटे हुए गुंजाइश के चर का उपयोग कर सकते हैं।

माता-पिता के क्षेत्र में परिभाषित चर के मान के सूचक के रूप में lambda फ़ंक्शन के __closure__ विशेषता के माध्यम से उपलब्ध stats चर।

 key, value = max(stats.iteritems(), key=lambda x:x[1]) 

यदि आप मूल्य के बारे में परवाह नहीं करते हैं (मुझे आश्चर्य होगा, लेकिन) आप कर सकते हैं:

 key, _ = max(stats.iteritems(), key=lambda x:x[1]) 

मुझे अभिव्यक्ति के अंत में एक [0] सबस्क्रिप्ट से बेहतर टपल अनपैकिंग पसंद है I मुझे लैम्ब्डा अभिव्यक्ति की पठनीयता बहुत पसंद नहीं है, लेकिन यह ऑपरेटर से बेहतर है। आईटेमेटटर (1) आईएमएचओ

यह देखते हुए कि एक से अधिक प्रविष्टि में मेरा अधिकतम मूल्य है I मैं उन चालों की एक सूची बनाऊँगा जिनके पास अधिकतम मूल्य है उनके मूल्य के रूप में।

 >>> stats = {'a':1000, 'b':3000, 'c': 100, 'd':3000} >>> [key for key,val in stats.iteritems() if val == max(stats.values())] ['b', 'd'] 

यह आपको 'बी' और किसी भी अन्य अधिकतम कुंजी को भी देगा

चयनित उत्तर में टिप्पणियों के माध्यम से पुनरावृत्त समाधान के अनुसार …

पायथन 3 में:

 max(stats.keys(), key=(lambda k: stats[k])) 

पायथन 2 में:

 max(stats.iterkeys(), key=(lambda k: stats[k])) 

collections.Counter साथ। आप कर सकते हैं काउंटर

 >>> import collections >>> stats = {'a':1000, 'b':3000, 'c': 100} >>> stats = collections.Counter(stats) >>> stats.most_common(1) [('b', 3000)] 

यदि उपयुक्त हो, तो आप बस एक खाली collections.Counter साथ शुरू कर सकते हैं। संपर्क करें और इसमें जोड़ें

 >>> stats = collections.Counter() >>> stats['a'] += 1 : etc. 

धन्यवाद, बहुत सुंदर, मुझे नहीं याद था कि अधिकतम "कुंजी" पैरामीटर की अनुमति देता है

बीटीडब्ल्यू, सही उत्तर प्राप्त करने के लिए ('बी') यह होना चाहिए:

 import operator stats = {'a':1000, 'b':3000, 'c': 100} max(stats.iteritems(), key=operator.itemgetter(1))[0] 
 Counter = 0 for word in stats.keys(): if stats[word]> counter: Counter = stats [word] print Counter 

एरिक कोड्डी का आसान समाधान +1 करने के लिए
और शब्दकोश में अधिकतम मूल्य के साथ एक चाबियाँ चुनने का भी एक तरीका:

 stats = {'a':1000, 'b':3000, 'c': 100, 'd':3000} import random maxV = max(stats.values()) choice = random.choice([key for key, value in stats.items() if value == maxV) 

मैंने स्वीकार किए गए उत्तर और बहुत ही बुनियादी लूप के खिलाफ @ thewolf के सबसे तेज़ समाधान का परीक्षण किया और लूप दोनों की तुलना में तेज़ था:

 import time import operator d = {"a"+str(i): i for i in range(1000000)} def t1(dct): mx = float("-inf") key = None for k,v in dct.items(): if v > mx: mx = v key = k return key def t2(dct): v=list(dct.values()) k=list(dct.keys()) return k[v.index(max(v))] def t3(dct): return max(dct.items(),key=operator.itemgetter(1))[0] start = time.time() for i in range(25): m = t1(d) end = time.time() print ("Iterating: "+str(end-start)) start = time.time() for i in range(25): m = t2(d) end = time.time() print ("List creating: "+str(end-start)) start = time.time() for i in range(25): m = t3(d) end = time.time() print ("Accepted answer: "+str(end-start)) 

परिणाम:

 Iterating: 3.8201940059661865 List creating: 6.928712844848633 Accepted answer: 5.464320182800293 

कैसा रहेगा:

  max(zip(stats.keys(), stats.values()), key=lambda t : t[1])[0]