অভিধানের মধ্যে সর্বনিম্ন মানের সাথে সম্পর্কিত কীটি পান


304

যদি আমার কাছে পাইথন অভিধান থাকে তবে আমি কীভাবে ন্যূনতম মান সহ প্রবেশের কীটি পেতে পারি?

আমি min()ফাংশনটি নিয়ে কিছু করার কথা ভাবছিলাম ...

ইনপুট দেওয়া হয়েছে:

{320:1, 321:0, 322:3}

এটি ফিরে আসবে 321


আপনার বিবৃত রিটার্নে টাইপ? নইলে 321 কেন? এটি 320 হওয়া উচিত নয়?
গ্রিনম্যাট

3
@ নিজেই: ঠিক আছে, এখন আমি দেখছি - যা চেয়েছিল তা হ'ল প্রবেশের মূল কী যেখানে প্রবেশের মান সর্বনিম্ন। প্রশ্নটি করার জন্য দয়া করে আরও ভাল শব্দটি করুন, অন্যরা স্পষ্টতই আমার মতো একই ধারণা করেছিল।
গ্রিনম্যাট

2
ডেটা স্ট্রাকচার সচেতনতা দিবস: আপনি যদি সর্বদা ন্যূনতম উপাদানকে জিজ্ঞাসা করেন (বা সরিয়ে ফেলেন) তবে অগ্রাধিকারের সারি বা হিপ ব্যবহার বিবেচনা করুন।
কর্নেল আতঙ্ক

উত্তর:


596

সেরা: min(d, key=d.get)- কোনও অকেজো lambdaইন্ডিয়ারেশন লেয়ারকে ইন্টারপোজ করার বা আইটেম বা কীগুলি বের করার কোনও কারণ নেই !


5
@ কারেলব্লেক এর অর্থ আপনি [11, 22, 33]একটি অভিধান উদাহরণের পরিবর্তে একটি তালিকা যেমন "ডি" হিসাবে পাস করেছেন {1: 11, 2:22, 3:33}। 'd.get' অভিধানের জন্য বৈধ, তবে তালিকার জন্য নয়।
টুলমেকারস্টেভ

9
যদি দুটি ভিন্ন কী একই মান হয়? এবং তারা উভয়ই সবচেয়ে কম মান হতে পারে? আপনি কিভাবে এটি উভয় ফেরত করতে পারেন?
user3226932

5
ডিক মানগুলি যদি তালিকা হিসাবে থাকে তবে এই কৌশলটি ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ: d={"a":[10, None], "b":[20, None]}যেখানে ডি [কী] [0] থেকে মিনিট গণনা করা হয়?
ট্র্যাক জনসন

4
কিভাবে কাজ করে? এটি কোন ধরণের ন্যূনতম ফাংশনটি হ'ল, আমি ভেবেছিলাম মিনিম () কেবলমাত্র ব্যক্তিগত মান বা তালিকাকে যুক্তি হিসাবে গ্রহণ করে। এটি অভিধানে থাকা সমস্ত এন্ট্রিগুলিকে কীভাবে লুপ করবে?
আজুরই

2
min()সাজানো প্রথম মান মান প্রদান। কীগুলি মানগুলি বাছাই করার জন্য উপায় নির্ধারণ করে। key=d.getমানে তালিকাটি অভিধানের মান অনুসারে বাছাই করা হবে।
notilas

45

এখানে একটি উত্তর যা ওপি এর কাছে জিজ্ঞাসা করা সমাধানটি দেয়:

>>> 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()বড় অভিধানের জন্য আরও দক্ষ হতে হবে কিন্তু।


3
ল্যাম্বদার পরিবর্তে আপনি ব্যবহার করতে পারেন operator.itemgetter(1)
ফিলিপ

2
পরিবর্তে লামদা ব্যবহার করুন d.get
টেক্সম 512

এটি চাওয়া অনুসারে কীটি ফেরত দেয় না, তবে (কী, মান) জুটি।
এরিক হে লেবিগোট

14

সমান সর্বনিম্ন মানযুক্ত একাধিক কীগুলির জন্য, আপনি একটি তালিকা বোঝার ব্যবহার করতে পারেন:

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

1
আপনার উত্তরটি খুব কার্যকর এবং অন্যরা সম্ভবত সম্মত হন: গৃহীত উত্তরে সেই বিষয়ে একাধিক মন্তব্য দেখুন। যাইহোক, এটি সন্ধান করার জন্য আমার দুবার ফিরে আসার দরকার ছিল: আপনি কি গৃহীত উত্তরের কোনও সম্পাদনার প্রস্তাব বিবেচনা করবেন? ইতিমধ্যে আপনার পরিপূরক।
jmon12


6
>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k]) 
321

@ সাইলেন্টগোস্ট, @ ব্লব 8108: ডিওহ! অনুলিপি এবং পেস্ট snafu। এখনই স্থির।
ড্যানিয়েল স্টুটজবাচ

দুর্দান্ত সমাধান আমি মনে করি, তবে বেনামে ফাংশন কেবল ইন্ডিয়ারেশনের একটি স্তর যুক্ত করে: key=d.getএটি আরও ভাল।
এরিক হে লেবিগোট

6

যে ক্ষেত্রে আপনার একাধিক ন্যূনতম কী রয়েছে এবং এটি সহজ রাখতে চান

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']

4

আপনি যদি নিশ্চিত হন না যে আপনার একাধিক ন্যূনতম মান নেই, তবে আমি পরামর্শ দেব:

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

3

সম্পাদনা করুন: এটি সর্বনিম্ন কী সম্পর্কে অপের মূল প্রশ্নের উত্তর, ন্যূনতম উত্তর নয়।


আপনি keysফাংশনটি ব্যবহার করে ডিকের কীগুলি পেতে পারেন এবং minসেই তালিকার সর্বনিম্ন সন্ধানের জন্য আপনি সঠিক ব্যবহার করছেন ।


সত্যিকার অর্থে ডাউনটা পাওয়ার যোগ্য নয়, কারণ পোস্টারের মূল প্রশ্নটি যতটা স্পষ্ট ছিল তেমন পরিষ্কার ছিল না।
গ্রিনম্যাট

@ স্পেস_সি0 ডব্লিউবি: সম্ভবত আপনি এতোটাই দয়া করে খেয়াল করতে পারেন যে আমি উত্তর দেওয়ার পরে ওপি তার প্রশ্নটিকে কিছু অন্যরকম বোঝাতে সম্পাদনা করেছিল
এলি বেন্ডারস্কি

3

একই ন্যূনতম মান সহ একাধিক কীগুলির ইস্যুটি সম্বোধন করার জন্য আরেকটি পদ্ধতি:

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

2

minএকটি পুনরুক্তি দিয়ে ব্যবহার করুন (এর itemsপরিবর্তে অজগর 3 ব্যবহারের জন্য iteritems); ল্যাম্বদা পরিবর্তে ব্যবহার করুনitemgetter অপারেটরটি থেকে যা ল্যাম্বদার চেয়ে দ্রুত।

from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))


1

নীচের তিনটি বিকল্প কীভাবে সম্পাদন করে তা তুলনা করেছি:

    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

0

একটি অপরিবর্তনীয় শ্রেণি তৈরি করতে আপনাকে functions টি বিশেষ ফাংশন ওভাররাইড করতে হবে, যাতে এটি কমপক্ষে () ফাংশন দ্বারা ডাকা হবে

এই পদ্ধতিগুলি __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]))

এটি আমার জন্য কাজ করেছে।


0
min(zip(d.values(), d.keys()))[1]

মান এবং কীযুক্ত টিপলসের একটি পুনরুক্তি তৈরি করতে জিপ ফাংশনটি ব্যবহার করুন। তারপরে এটি একটি মিনিট ফাংশন দিয়ে মুড়ে নিন যা সর্বনিম্ন কীটির উপর নির্ভর করে সর্বনিম্ন নেয়। এটি (মান, কী) জুটিযুক্ত একটি টিপল ফেরত দেয়। [1] এর সূচকটি সংশ্লিষ্ট কী পেতে ব্যবহৃত হয়


2
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
εηοιτ.εηοιτ.βε

@ β.εηοιτ.βε এর চেয়ে ভাল?
রাজ

-1
# python 
d={320:1, 321:0, 322:3}
reduce(lambda x,y: x if d[x]<=d[y] else y, d.iterkeys())
  321

6
1) হ্রাস সাধারণভাবে itertools তুলনায় ধীর। 2) হ্রাসের বেশিরভাগ বাস্তবায়ন যেকোন বা সকলের সাথে সহজতর করা যায়। 3) আমি জিভিআর এর জন্য একটি দৈত্য মুখপত্র। 4) অপারেটর মডিউলটি সবচেয়ে সহজ ল্যাম্বডাসকে অপ্রয়োজনীয় করে তোলে এবং জটিল ল্যাম্বডাসকে যাইহোক বাস্তব ফাংশন হিসাবে সংজ্ঞায়িত করা উচিত। সম্ভবত আমি কেবল কার্যকরী প্রোগ্রামিং থেকে ভয় পাই। ;)
মাইকড

@ পছন্দ হয়েছে: আমাকে আরও বলুন। জিভিআর কি এবং অপারেটর মডিউলটি কী? আপনি লিঙ্ক পোস্ট করতে পারেন? আমি অন্যকে জানতে পারি, তবে আমি আজও পাইথনের মধ্যবর্তী। শেখার ইচ্ছা! :-)
eruciform

জিভিআর হলেন গাইডো ভ্যান রসুম, জীবনের জন্য পাইথনের দানশীল স্বৈরশাসক। তাঁর কাছ থেকে পাঁচ বছরের একটি পুরানো পোস্ট এখানে ব্যাখ্যা করছে যে কেন লিস্প-ইসেমস (মানচিত্র, ফিল্টার, হ্রাস, ল্যাম্বদা) অজগরকে এগিয়ে যাওয়ার খুব বেশি জায়গা নেই এবং সে কারণগুলি আজও সত্য। অপারেটর মডিউলটির সদস্যগুলি আহরণের জন্য প্রতিস্থাপন রয়েছে : "ল্যাম্বদা এক্স: এক্স [1]" "আইটেমটেটার (1)" এর তুলনায় "একটি অক্ষর দীর্ঘতর এবং তর্কসাপেক্ষে বুঝতে আরও সময় নেয়। আমি জায়গা ছাড়াই, কিন্তু প্রশ্ন জিজ্ঞাসা!
মাইকড

@ মাইকযুক্ত: আপেলকে প্রথমে কামড়াতে চান? stackoverflow.com/questions/3292481/...
eruciform

এগুলিতে ( min()) এর অন্তর্নির্মিত কোনও কিছুর পুনর্বিবেচনা করার দরকার নেই ।
এরিক হে লেবিগোট

-8

আপনি যেটা খুঁজছিলেন এটাই কি সেটা?

d = dict()
d[15.0]='fifteen'
d[14.0]='fourteen'
d[14.5]='fourteenandhalf'

print d[min(d.keys())]

মুদ্রিত 'চৌদ্দ'


8
-1: প্রশ্ন জিজ্ঞাসা কি নয়। আপনি সর্বনিম্ন কী দিয়ে মানটি ফিরিয়ে দিচ্ছেন, ওপি সর্বনিম্ন মান সহ কী চায়
ব্রায়ান এস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.