যদি আমার কাছে পাইথন অভিধান থাকে তবে আমি কীভাবে ন্যূনতম মান সহ প্রবেশের কীটি পেতে পারি?
আমি 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]
একটি অভিধান উদাহরণের পরিবর্তে একটি তালিকা যেমন "ডি" হিসাবে পাস করেছেন {1: 11, 2:22, 3:33}
। 'd.get' অভিধানের জন্য বৈধ, তবে তালিকার জন্য নয়।
d={"a":[10, None], "b":[20, None]}
যেখানে ডি [কী] [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
একটি পুনরুক্তি দিয়ে ব্যবহার করুন (এর items
পরিবর্তে অজগর 3 ব্যবহারের জন্য 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
একটি অপরিবর্তনীয় শ্রেণি তৈরি করতে আপনাকে 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]))
এটি আমার জন্য কাজ করেছে।
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())]
মুদ্রিত 'চৌদ্দ'