অভিধানে সর্বাধিক মান সহ কী পাচ্ছেন?


866

আমার একটি রয়েছে dictionary: কীগুলি স্ট্রিং, মানগুলি পূর্ণসংখ্যা।

উদাহরণ:

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

আমি 'b'একটি উত্তর হিসাবে পেতে চাই , যেহেতু এটি উচ্চ মানের মূল কী।

বিপরীত কী-মান টিপলস সহ একটি মধ্যবর্তী তালিকা ব্যবহার করে আমি নিম্নলিখিতটি করেছি:

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

এটি কি আরও ভাল (বা আরও মার্জিত) পদ্ধতির?


1
উম, এতে কি দোষ max(stats)?
জন রেড

12
max(stats)কীগুলি হিসাবে লেবেলগুলি ব্যবহার করবে (এটি 'c'সর্বাধিক লেবেল দেওয়া সত্ত্বেও ফিরে আসবে ), max(stats, key=lambda key: stats[key])ওপি পরে কী ছিল (যা ফিরে আসবে 'b', সর্বাধিক সূচকযুক্ত মানের লেবেল)। এটা কি পরিষ্কার?
আটকোল্ড

উত্তর:


609

আপনি এটির operator.itemgetterজন্য ব্যবহার করতে পারেন :

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

এবং পরিবর্তে মেমরি ব্যবহারে একটি নতুন তালিকা তৈরি করুন stats.iteritems()keyথেকে প্যারামিটার max()ফাংশন একটি ফাংশন যা এমন একটি কী র্যাঙ্ক আইটেম কিভাবে নির্ধারণ করতে ব্যবহৃত হয় নির্ণয় করা হয়।

দয়া করে মনে রাখবেন যে আপনার যদি অন্য কী-মানের জুটি 'd': 3000 থাকে তবে এই পদ্ধতিটি উভয়টির সর্বাধিক মান থাকা সত্ত্বেও কেবল দুটির মধ্যে একটি ফেরত দেবে ।

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

পাইথন 3 ব্যবহার করা হলে:

>>> max(stats.items(), key=operator.itemgetter(1))[0]
'b'

241
এমনকি ক্লিনার, আমি মনে করি =max(stats.iterkeys(), key=(lambda key: stats[key]))
লুক্রটিয়েল

18
শুধু ব্যবহার key=lambda x: x[1]করবেন না কেন ?
বেনডুন্ডি 23'14

43
পাইথন 3 এ @ লুক্রাটিয়েল (সঠিক বানান) সমাধান ব্যর্থ। এটি হওয়া উচিত: সর্বাধিক (stats.keys (), কী = (ল্যাম্বদা কে: স্ট্যাটাস [কে])) যেহেতু কী () এখন এটিরকিগুলি () স্বয়ংক্রিয়ভাবে যা করত তা করে।
ওয়াটসোনিক

73
আপনি রিগথ। মজার বিষয় হল, মেমোরি দক্ষ হিসাবে ঠিক একই সমাধান এবং পাইথন 2 এবং 3 উভয় ক্ষেত্রেই কাজ করে:max(stats, key=lambda key: stats[key])
লুস্রেটিয়েল

3
সত্যই আমি মনে করি যে মন্তব্যগুলির ক্লিনার এবং আরও ভাল সমাধান রয়েছে।
অগস্টো গঞ্জালেজ

1177
max(stats, key=stats.get)

17
আপনি যদি সত্যিই এটি করতে চেয়েছিলেন তবে আপনি করতে পারেনstats[max(stats, key=stats.get)]
ক্র্যাকস্মোকার9000

81
@ স্কটমগ্রোগস্কি, এসএস এটি চাওয়া হিসাবে সর্বাধিক মান সহ কী সরবরাহ করে। সর্বাধিক মানটি কেবল সর্বাধিক (stats.values ​​()) হবে।
এ Coady

25
এটি উত্তর হওয়া উচিত কারণ এটি সহজতম এবং ওপি যা চেয়েছিল ঠিক তেমনই।
ইহাতেছে

4
@ কোয়েডি যদি দুটি কী (একই মান সহ) এর মধ্যে টাই হয়? আমি তাদের উভয় পেতে চাই, কিন্তু আমি একটি পেতে।
oba2311

10
@ ওবা 2311max_value = max(stats.values()); {key for key, value in stats.items() if value == max_value}

208

আমি অনেকগুলি বৈকল্পিক পরীক্ষা করেছি এবং সর্বাধিক মান দিয়ে ডিকের চাবিটি ফেরানোর দ্রুততম উপায়:

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}

এবং পাইথন ৩.২ এর অধীনে পরীক্ষার ফলাফল:

    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%     --

এবং পাইথন ২.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পাইথন ৩.২ এবং ২.7 এর অধীনে দ্রুততম (বা আরও সম্পূর্ণরূপে, keywithmaxvalএই পোস্টের শীর্ষে)


12
এটাকে ফিশ লাগছে। f7এর মতো f1, কেবল কোনও মধ্যবর্তী অবজেক্টকে একটি নাম না দেওয়া। f7হওয়া উচিত (খুব সামান্য) যতো তাড়াতাড়ি f1না অনেক ধীর। এবং >>> timeit.timeit("f1()","from __main__ import f1, f7, d1", number=10000) 0.26785888786807277 >>> timeit.timeit("f7()","from __main__ import f1, f7, d1", number=10000) 0.26770628307832567
এটিই

1
f1 মতামত f1 হয়। আইপথন% টাইমিটের সাথে পরীক্ষা করেছিলাম এবং উভয়ই পাইথন ২.7 এ আমার মেশিনে একই পারফরম্যান্স নিয়ে এসেছিল। পরীক্ষা: f1 - 18 প্রতি লুপ পরীক্ষায়: f2 - প্রতি লুপ পরীক্ষায় 33.3 µ s: f3b - লুপ প্রতি 50 µ গুলি: f4b - 30.7 µ গুলি প্রতি লুপ পরীক্ষা: f5 - 28 µ গুলি প্রতি লুপ পরীক্ষা: f6 - 23 lo গুলি প্রতি লুপ পরীক্ষা: f7 - 18 প্রতি লুপ টেস্টিং: f8 - 43.9 µ ​​প্রতি লুপ পরীক্ষা: f4 - 2.16 এমএস প্রতি লুপ পরীক্ষা: f3 - 2.29 এমএস প্রতি লুপ
জোপ

সর্বাধিক (ডি, কী) উপলভ্য নয় যেখানেই f1 প্রযোজ্য।
নিকস আলেকজান্দ্রিস

5
আমি ভেবেছিলাম ডিক অরচোর্টেড, ডি.কি এবং ডি.ভ্যালুগুলি তাত্ত্বিকভাবে আলাদাভাবে অর্ডার করা যায় না?
দিমাথ

1
তালিকা-অনুলিপি সমাধানগুলি আমার কাছে দুর্গন্ধযুক্ত। হাজার বা লক্ষ লক্ষ এন্ট্রি সহ ডিকের পারফরম্যান্সটি কেমন?
লুক্রেটিয়েল

63

আপনার যদি সর্বাধিক মান সম্বলিত একটি চাবি জানতে হয় তবে আপনি এটি ছাড়াই এটি করতে পারবেন iterkeysবা iteritemsপাইথনের অভিধানের মাধ্যমে পুনরাবৃত্তি হ'ল এটিগুলির কীগুলির মাধ্যমে পুনরাবৃত্তি।

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

সম্পাদনা করুন:

মন্তব্যগুলি থেকে, @ ব্যবহারকারী 1274878:

আমি পাইথনে নতুন am আপনি দয়া করে পদক্ষেপে আপনার উত্তর ব্যাখ্যা করতে পারেন?

হাঁ ...

সর্বোচ্চ

সর্বাধিক (পুনরাবৃত্তিযোগ্য [, কী])

সর্বাধিক (আরজি 1, আরগ 2, * আরগস [, কী])

সবচেয়ে বড় আইটেমটি পুনরাবৃত্তযোগ্য বা দুটি বা তার বেশি আর্গুমেন্টের মধ্যে সবচেয়ে বড় ফিরিয়ে দিন।

Amongচ্ছিক keyযুক্তি কীভাবে উপাদানগুলির মধ্যে সর্বাধিক পাওয়ার জন্য তুলনা করবেন তা বর্ণনা করে:

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

প্রত্যাবর্তিত মানগুলির তুলনা করা হবে।

অভি

পাইথন ডিক হ্যাশ টেবিল। ডিকের একটি কী একটি বস্তুর একটি হ্যাশকে কী হিসাবে ঘোষণা করা হয়। কর্মক্ষমতার কারণে পুনরাবৃত্তি যদিও কোনও ডিকটি এর কীগুলির মাধ্যমে পুনরাবৃত্তি হিসাবে প্রয়োগ করা হয়েছিল।

অতএব আমরা কীগুলির তালিকা পাওয়ার অপারেশন থেকে মুক্তি দিতে এটি ব্যবহার করতে পারি।

অবসান

অন্য ফাংশনের ভিতরে সংজ্ঞায়িত কোনও ফাংশনকে নেস্টেড ফাংশন বলে। নেস্টেড ফাংশনগুলি এনকোলেসিং স্কোপের ভেরিয়েবল অ্যাক্সেস করতে পারে।

statsপরিবর্তনশীল প্রাপ্তিসাধ্য মাধ্যমে __closure__এর অ্যাট্রিবিউট lambdaপরিবর্তনশীল পিতা বা মাতা সুযোগ সংজ্ঞায়িত মান একটি পয়েন্টার হিসাবে ফাংশন।


1
@ আই 159: আমি অজগর থেকে নতুন। আপনি দয়া করে পদক্ষেপগুলিতে আপনার উত্তরটি ব্যাখ্যা করতে পারেন
ব্যবহারকারী 1274878

57

উদাহরণ:

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

যদি আপনি এর কীটি দিয়ে সর্বাধিক মানটি খুঁজে পেতে চান, তবে ফলোলিং কোনও প্রাসঙ্গিক ফাংশন ছাড়াই সহজ হতে পারে।

max(stats, key=stats.get)

আউটপুট হল কীটি যার সর্বাধিক মান থাকে।


এই সমাধানটি সর্বোচ্চের চেয়ে দ্রুত পরীক্ষিত হয়েছে (পরিসংখ্যান, কী =
ল্যাম্বদা

46

এখানে অন্য একটি:

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

ফাংশনটি keyকেবল সেই মানটি দেয় যা র্যাঙ্কিংয়ের জন্য ব্যবহার করা উচিত এবং max()দাবি করা উপাদানটি এখনই ফিরিয়ে দেয়।


10
আপনার উত্তরে .পিটারকিগুলির প্রয়োজন হয় না (ডিক্ট পুনরাবৃত্তি করার সময় এটি ডিফল্ট)। তবে, নোট করুন যে .iteitems পদ্ধতিটি এক ধাপে কী এবং মান উভয়ই আনে, সুতরাং । পিটারকিসের সাহায্যে কী অনুসারে অতিরিক্ত গেটাইটেমের প্রয়োজন নেই।
tzot

এটি একটি দুর্দান্ত উত্তর কারণ এটি কী স্পষ্ট তা খুব স্পষ্ট এবং এইভাবে অন্যান্য পরিস্থিতিতে প্রসারিত করা সহজ।
লিওপড

পাইথন 3 সংস্করণে:max(stats, key=lambda k: stats[k])
আরে

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

আপনি যদি মূল্য সম্পর্কে চিন্তা না করেন (আমি অবাক হব, তবে) আপনি এটি করতে পারেন:

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

আমি টিউপলটি ভাব প্রকাশের শেষে [0] সাবস্ক্রিপ্টের চেয়ে আরও ভাল আনপ্যাক করা পছন্দ করি। আমি কখনই ল্যাম্বডা এক্সপ্রেশনগুলির পঠনযোগ্যতা পছন্দ করি না তবে এটি অপারেটর.ইটিমেজেটার (1) আইএমএইচওর চেয়ে ভাল।


9
_পরিবর্তে ব্যবহার করা যেতে পারে ignored
jfs

1
@ জেফাসেবাস্টিয়ান আমি সম্মত হলাম যে ignoredদেখতে দেখতে খুব কুৎসিত দেখাচ্ছে তবে কিছু লোক _বিভিন্ন কারণে ব্যবহার করার বিরোধিতা করছেন । আমি মনে করি প্রথম স্নিপেটটি যদি আপনি মানটিকে অবজ্ঞা করেন
তবেও

30

একাধিক এন্ট্রি দেওয়া আমার সর্বোচ্চ মান রয়েছে। আমি কীগুলির একটি তালিকা তৈরি করব যাগুলির মান হিসাবে সর্বোচ্চ মান রয়েছে।

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

এটি আপনাকে 'বি' এবং অন্য কোনও সর্বোচ্চ কী দেবে।

দ্রষ্টব্য: অজগর 3 এর stats.items()পরিবর্তে ব্যবহার করুনstats.iteritems()


9
আপনার সমাধান ঠিক আছে তবে ডিকটিতে আইটেম রয়েছে যতবার সর্বাধিক মানকে গণনা করে। যদি কম্পিউটিং maxব্যয়বহুল হত (উদাহরণস্বরূপ, একটি দীর্ঘ অভিধান) [key for m in [max(stats.values())] for key,val in stats.iteritems() if val == m]আপনি যদি ওয়ান-লাইনার চান তবে আমি সুপারিশ করব অন্যথায় m = ...আগেই গণনা করুন ।
gboffi

4
একটি সংক্ষিপ্ত নোট: পাইথন 3 এর জন্য stats.iteitems () এর পরিবর্তে stats.items () ব্যবহার করুন।
সুসা

21

তুমি ব্যবহার করতে পার:

max(d, key = d.get) 
# which is equivalent to 
max(d, key = lambda k : d.get(k))

কীটি ফেরত দিতে, মান জোড় ব্যবহার করুন:

max(d.items(), key = lambda k : k[1])

7
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, এটি অপারেটর ব্যবহারের চেয়ে অনেক সহজ
সিগ্ল্যামিক্স

19

অভিধানের সর্বাধিক কী / মান পেতে stats:

stats = {'a':1000, 'b':3000, 'c': 100}
  • কীগুলির উপর ভিত্তি করে

>>> max(stats.items(), key = lambda x: x[0]) ('c', 100)

  • মানের উপর ভিত্তি করে

>>> max(stats.items(), key = lambda x: x[1]) ('b', 3000)

অবশ্যই, আপনি যদি ফলাফল থেকে কেবল কী বা মান পেতে চান তবে আপনি টুপল ইনডেক্সিং ব্যবহার করতে পারেন। উদাহরণস্বরূপ, সর্বাধিক মানের সাথে সম্পর্কিত কীটি পেতে:

>>> max(stats.items(), key = lambda x: x[1])[0] 'b'

ব্যাখ্যা

items()পাইথন 3 এ অভিধান পদ্ধতি অভিধানের একটি ভিউ অবজেক্ট প্রদান করে। maxফাংশন দ্বারা এই ভিউ অবজেক্টটি পুনরাবৃত্তি করা হয়, এটি অভিধানের আইটেমগুলি ফর্মের tuples হিসাবে উপার্জন করে (key, value)

>>> list(stats.items()) [('c', 100), ('b', 3000), ('a', 1000)]

আপনি যখন প্রতিটি পুনরাবৃত্তিতে lambdaএক্সপ্রেশনটি ব্যবহার করেন তখন এই টিপলগুলির মধ্যে একটি । সুতরাং, সঠিক সূচকটি বেছে নিয়ে আপনি কী বা মান দ্বারা তুলনা করতে চান তা নির্বাচন করুন।lambda x: x[1]x(key, value)

পাইথন 2

পাইথন ২.২++ রিলিজের জন্য, একই কোডটি কাজ করবে। তবে, পারফরম্যান্সের iteritems()পরিবর্তে অভিধান পদ্ধতি ব্যবহার করা ভাল items()

মন্তব্য



10

নির্বাচিত উত্তরে মন্তব্যের মাধ্যমে পুনরাবৃত্ত সমাধানগুলি ...

পাইথন 3 এ:

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

পাইথন 2 এ:

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

পাইথন 3 এর জন্য আপনার সমাধান পাইথন ২.7 এর জন্যও কাজ করে।
patapouf_ai

4
কারণ কী () পাইথন 2 এ কোনও পুনরুক্তি ফেরত দেয় না এবং তাই একটি পারফরম্যান্স হিট নেয়
ওয়াটসোনিক

10

mydict.keys()মানটির উপর ভিত্তি করে কীভাবে ফিরে আসব তা সন্ধান করতে আমি এখানে এসেছি mydict.values()। কেবল একটি চাবি ফিরে আসার পরিবর্তে আমি শীর্ষস্থানীয় x সংখ্যাটি প্রত্যাশা করছিলাম ।

এই সমাধানটি max()ফাংশনটি ব্যবহার করার চেয়ে সহজ এবং আপনি সহজেই ফিরে আসা মানগুলির সংখ্যা পরিবর্তন করতে পারেন:

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

x = sorted(stats, key=(lambda key:stats[key]), reverse=True)
['b', 'a', 'c']

আপনি যদি একক সর্বোচ্চ র‌্যাঙ্কিং কীটি চান তবে কেবল সূচকটি ব্যবহার করুন:

x[0]
['b']

আপনি যদি শীর্ষ দুটি সর্বোচ্চ র‌্যাঙ্কিং কীগুলি চান তবে কেবল স্লাইসিং তালিকা ব্যবহার করুন:

x[:2]
['b', 'a']

এটি একটি খুব অদক্ষ সমাধান। ডিকটি বাছাই করার ফলে এন লগের একটি রানটাইম আনা হবে (এন) কারণ আপনি নিজের সম্পর্কে সর্বাধিক নয় এমন একগুচ্ছ মানগুলি নিয়ে। সর্বাধিক ফাংশনটি ব্যবহার করা কেবল n এর একটি রানটাইম ব্যয় করবে যা অনেক দ্রুত।
পিটার গ্রাহাম

1
@ পিটারগ্রাহাম এখানে প্রায় প্রতিটি সমাধান (স্বীকৃত উত্তর সহ) ব্যবহার করে max()। এটি স্পষ্ট যে এটি দ্রুততম। আমি ভেবেছিলাম আমি
কাটানোর

8

আমি এই উত্তরের কোনও সন্তুষ্ট ছিল না। maxসর্বদা সর্বোচ্চ মান সহ প্রথম কীটি রাখে। অভিধানটিতে সেই মান সহ একাধিক কী থাকতে পারে।

def keys_with_top_values(my_dict):
    return [key  for (key, value) in my_dict.items() if value == max(my_dict.values())]

এই উত্তর পোস্ট করা যদি এটি কাউকে সাহায্য করে। নীচে এসও পোস্ট দেখুন

টাইয়ের ক্ষেত্রে পাইথন কোনটি সর্বোচ্চ পছন্দ করে?


7

আপনি 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. 

5

একটি হিপ সারি হল একটি সাধারণ সমাধান যা আপনাকে মান অনুসারে শীর্ষস্থানীয় এন কীগুলি নিষ্কাশন করতে দেয় :

from heapq import nlargest

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

res1 = nlargest(1, stats, key=stats.__getitem__)  # ['b']
res2 = nlargest(2, stats, key=stats.__getitem__)  # ['b', 'a']

res1_val = next(iter(res1))                       # 'b'

নোটটি dict.__getitem__সিনট্যাকটিক চিনি দ্বারা ডাকা পদ্ধতি dict[]। এর বিপরীতে dict.get, KeyErrorকোনও কী না পাওয়া গেলে এটি ফিরে আসবে , যা এখানে ঘটতে পারে না।


4

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


1
এটি সদৃশ সর্বোচ্চ মান সহ কী দ্বারা অর্ডার করবে। এটি পছন্দসই বা নাও থাকতে পারে।
রব রোজ

2

অ্যারিক কোডির সহজতম সমাধানটি +1 তে ।
এবং এলোমেলো করার একটি উপায়ও অভিধানে সর্বাধিক মান সহ কীগুলির একটি নির্বাচন করুন:

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

import random
maxV = max(stats.values())
# Choice is one of the keys with max value
choice = random.choice([key for key, value in stats.items() if value == maxV])


1

কেমন:

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

3
zip(stats.keys(), stats.values())লেখার জন্য কেবল একটি দীর্ঘ পথ stats.items()। একবার আপনি এই পরিবর্তনটি করে ফেললে আপনার উত্তরটি বেশ কয়েকটি পুরানো উত্তরের সাথে প্রায় একই রকম হবে ।
ভোল্টাহ

সম্মত হয়েছি, আমি অবগত ছিলাম না যে আইটেমগুলি () জিপ হিসাবে একই
ব্যবহারকারী 2399453

itemsযেমন হয় না zip। এটি ঠিক একই ফলাফল উত্পাদন করে।
পল রুনি

0

আমি খুব বেসিক লুপের বিরুদ্ধে গৃহীত উত্তর এবং @ থিওল্ফের দ্রুততম সমাধানটি পরীক্ষা করেছি এবং লুপ উভয়ের চেয়ে দ্রুত ছিল:

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

0

বৈজ্ঞানিক পাইথন ব্যবহারকারীদের জন্য, পান্ডাস ব্যবহার করে এখানে একটি সহজ সমাধান রয়েছে:

import pandas as pd
stats = {'a': 1000, 'b': 3000, 'c': 100}
series = pd.Series(stats)
series.idxmax()

>>> b

0

ক্ষেত্রে একই মান সহ আপনার একাধিক কী রয়েছে উদাহরণস্বরূপ:

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

আপনি নিম্নলিখিত কীভাবে সর্বোচ্চ মান সহ সমস্ত কী সহ একটি সংগ্রহ পেতে পারেন:

from collections import defaultdict
from collections import OrderedDict

groupedByValue = defaultdict(list)
for key, value in sorted(stats.items()):
    groupedByValue[value].append(key)

# {1000: ['a'], 3000: ['b', 'd', 'e'], 100: ['c']}

groupedByValue[max(groupedByValue)]
# ['b', 'd', 'e']

0

পদ্ধতির বোঝার জন্য আরও সহজ:

dict = { 'a':302, 'e':53, 'g':302, 'h':100 }
max_value_keys = [key for key in dict.keys() if dict[key] == max(dict.values())]
print(max_value_keys) # prints a list of keys with max value

আউটপুট: ['ক', 'জি']

এখন আপনি কেবল একটি চাবি চয়ন করতে পারেন:

maximum = dict[max_value_keys[0]]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.