'কী' এবং ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে পাইথন সর্বাধিক ফাংশন


180

আমি ওওপি ব্যাকগ্রাউন্ড থেকে এসে অজগরটি শেখার চেষ্টা করছি trying আমি সেই maxফাংশনটি ব্যবহার করছি যা তালের মধ্যে Playerসর্বাধিক থাকার টাইপের উদাহরণটি ফেরত দিতে ল্যাম্বডা এক্সপ্রেশন ব্যবহার totalScoreকরে players

def winner():
    w = max(players, key=lambda p: p.totalScore)

ফাংশনটি সঠিকভাবে Playerসর্বাধিক থাকার টাইপের উদাহরণ দেয় totalScore। আমি নিম্নলিখিত তিনটি জিনিস সম্পর্কে বিভ্রান্ত:

  1. maxফাংশনটি কীভাবে কাজ করে? এটি কি আর্গুমেন্ট গ্রহণ করা হয়? আমি নথির দিকে তাকালাম কিন্তু বুঝতে ব্যর্থ হয়েছি।
  2. keyসর্বোচ্চ ফাংশনে কীওয়ার্ডটির ব্যবহার কী ? আমি জানি এটি sortফাংশনের প্রসঙ্গেও ব্যবহৃত হয়
  3. লাম্বদা অভিব্যক্তির অর্থ? সেগুলি কীভাবে পড়বেন? তারা কিভাবে কাজ করে?

এগুলি সমস্ত খুব নোবিশ ধারণামূলক প্রশ্ন তবে ভাষাটি আমাকে বুঝতে সহায়তা করবে। আপনি ব্যাখ্যা করার জন্য উদাহরণ দিতে পারলে এটি সহায়তা করবে। ধন্যবাদ


কোন পাইথন সংস্করণ?
charmlessCoin

2
আপনি কি ডকুমেন্টেশনের সাথে পরামর্শ করেছেন ?
ইনবার রোজ

@ চার্মলেসকয়েন অজগর ২.7.৫
বিজয়

2
@ ইনবাররোজ আমি সর্বোচ্চ ফাংশনের জন্য ডকুমেন্টেশন চেক করেছি। আসলেই বুঝতে পারিনি।
বিজয়

10
@ ইন্বাররোজ এই পৃষ্ঠাটি এখন গুগলের জন্য শীর্ষ ফলাফল python max lambdaএবং সম্ভবত নতুন ব্যবহারকারীদের জন্য আরও সহায়ক হতে পারে।
চিহ্নিত করুন

উত্তর:


274

lambda এটি একটি বেনামি ফাংশন, এটি সমান:

def func(p):
   return p.totalScore     

এখন maxহয়ে যায়:

max(players, key=func)

তবে defবিবৃতিগুলি যৌগিক বিবৃতি হিসাবে সেগুলি ব্যবহার করা যায় না যেখানে একটি অভিব্যক্তি প্রয়োজন হয়, তাই কখনও কখনও lambdaব্যবহৃত হয়।

দ্রষ্টব্য এটি lambdaএকটি এর রিটার্ন বিবৃতিতে আপনি যা চেয়েছিলেন তার সমান def। সুতরাং, আপনি এ এর ​​মধ্যে স্টেটমেন্ট ব্যবহার করতে পারবেন না lambda, কেবলমাত্র এক্সপ্রেশনগুলির অনুমতি রয়েছে।


কি করে max?

সর্বাধিক (ক, খ, সি, ... [, কী = ফানক]) -> মান

একক পুনরাবৃত্তিযোগ্য যুক্তি দিয়ে, এর বৃহত্তম আইটেমটি ফিরিয়ে দিন। দুই বা ততোধিক যুক্তি সহ, বৃহত্তম যুক্তিটি ফিরিয়ে দিন।

সুতরাং, এটি কেবলমাত্র সবচেয়ে বড় বস্তুটি ফেরত দেয়।


কিভাবে keyকাজ করে?

পাইথন 2 এ ডিফল্টরূপে keyআইটেমগুলির প্রকারের ভিত্তিতে নিয়মের একটি সেটের ভিত্তিতে আইটেমগুলির তুলনা করা হয় (উদাহরণস্বরূপ একটি স্ট্রিং সবসময় পূর্ণসংখ্যার চেয়ে বড় হয়)।

তুলনা করার আগে অবজেক্টটি সংশোধন করতে, বা কোনও বিশেষ গুণ / সূচকের ভিত্তিতে তুলনা করতে আপনাকে keyযুক্তিটি ব্যবহার করতে হবে ।

উদাহরণ 1:

একটি সাধারণ উদাহরণ হিসাবে ধরুন, আপনার কাছে স্ট্রিং আকারে সংখ্যার একটি তালিকা রয়েছে তবে আপনি সেই আইটেমগুলিকে তাদের পূর্ণসংখ্যার মান দ্বারা তুলনা করতে চান।

>>> lis = ['1', '100', '111', '2']

এখানে maxআইটেমগুলিকে তাদের মূল মানগুলি ব্যবহার করে তুলনা করুন (স্ট্রিংগুলি অভিধানের সাথে তুলনা করা হয় যাতে আপনি '2'আউটপুট হিসাবে পেতে পারেন ):

>>> max(lis)
'2'

আইটেমগুলিকে তাদের পূর্ণসংখ্যার মান ব্যবহার keyকরে একটি সাধারণের সাথে তুলনা করতে lambda:

>>> max(lis, key=lambda x:int(x))  # compare `int` version of each item
'111'

উদাহরণ 2: maxটিপলগুলির তালিকায় প্রয়োগ করা।

>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]

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

>>> max(lis)
(4, 'e')

তবে, আপনি যদি প্রতিটি আইটেমকে সূচক 1 এর মানের সাথে তুলনা করতে চান? সহজ: ব্যবহার lambda:

>>> max(lis, key = lambda x: x[1])
(-1, 'z')

একটি পুনরাবৃত্তযোগ্য আইটেমের তুলনায় বিভিন্ন ধরণের অবজেক্ট রয়েছে :

মিশ্র আইটেমগুলির সাথে তালিকা:

lis = ['1','100','111','2', 2, 2.57]

পাইথন 2 এ দুটি ভিন্ন ধরণের আইটেমের তুলনা করা সম্ভব :

>>> max(lis)  # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x))  # compare integer version of each item
'111'

কিন্তু পাইথন 3 এ আপনি আর এটি করতে পারবেন না :

>>> lis = ['1', '100', '111', '2', 2, 2.57]
>>> max(lis)
Traceback (most recent call last):
  File "<ipython-input-2-0ce0a02693e4>", line 1, in <module>
    max(lis)
TypeError: unorderable types: int() > str()

তবে এটি কাজ করে, যেমন আমরা প্রতিটি বস্তুর পূর্ণসংখ্যা সংস্করণটির তুলনা করছি:

>>> max(lis, key=lambda x: int(x))  # or simply `max(lis, key=int)`
'111'

আমি মনে করি এটি পুরানো, তবে এই বিষয়ে আমার একটি প্রশ্ন ছিল। আমি ল্যাম্বদা ফাংশনটি দেখতে পাই, ভেরিয়েবল এক্স বা আমি বা অন্য যে কোনও কিছু সর্বদা তালিকার সেই সূচকের মান উপস্থাপন করে। এই পুনরাবৃত্তিটি সর্বাধিক কার্য দ্বারা বা ল্যাম্বডা দ্বারা সম্পন্ন হয়েছে? ল্যাম্বদা ফাংশনগুলি কি সর্বদা সম্ভাব্য মানগুলি নিয়ে পুনরাবৃত্তি করে? উদাহরণস্বরূপ: lengths = map(lambda word: len(word), words)যেখানে words=['It', 'is', 'raining', 'cats', 'and', 'dogs']আমি দেখতে পাচ্ছি যে ল্যাম্বদা তালিকার প্রতিটি শব্দের সাথে পুনরাবৃত্তি করছে। এটি কি সর্বদা এটি করে?
মো 2

1
@ মো 2 Iteration maxনা দ্বারা করা হয় lambda( আরগটি alচ্ছিক key) এবং পুনরাবৃত্তির সময় প্রতিটি আইটেম নির্দিষ্ট করা ফাংশনে প্রেরণ করা হয় keyএবং প্রত্যাবর্তিত মানটি তারপরে তুলনার জন্য ব্যবহার করা হয়।
অশ্বিনী চৌধুরী চৌধুরী

2
কেবলমাত্র "সর্বোচ্চ কী পরামিতি" গুগল করে এখানে আসা লোকদের জন্য। max(lis, key=lambda x:int(x))হিসাবে সরলীকৃত করা যেতে পারে max(lis, key=int)। পাইথনের একটি অন্তর্নির্মিত ফাংশন রয়েছে, (int)। একইভাবে আপনি keyআর্গুমেন্ট হিসাবে অন্য কোনও অন্তর্নির্মিত ফাংশন ব্যবহার করতে পারেন । দৃষ্টান্তস্বরূপ আপনি দীর্ঘতম স্ট্রিং থেকে পেতে পারেন lis=['a', 'aa', 'aaa']দ্বারাmax(lis, key=len)
তরুণ

1
@YOUNG আমরা কী যুক্তি ফাংশন builtin না শুধু যে কোনো ফাংশন ব্যবহার করতে পারেন, শুধুমাত্র এই শর্তে যে ফাংশন দ্বারা এটি পাস আইটেম গ্রহণ করা উচিত নয় max, min, sortedইত্যাদি সঠিকভাবে। প্লাস আমি max(lis, key=int)ঠিক শেষে উল্লেখ করেছি । :-)
অশ্বিনী চৌধুরী

@ অশ্বিনী চৌধুরী চৌধুরী .. ধরুন আমার কাছে যদি [1,2,3,4,5] এর মতো একটি তালিকা থাকে। এখানে সমস্ত আইটেম আলাদা। আমি সর্বাধিক ঘন ঘন আইটেমগুলি সন্ধানের জন্য প্রদত্ত ফাংশন সর্বাধিক (সেট (মাইলিস্ট), কী = মাইলিস্ট কোড) ব্যবহার করছি। যেহেতু এই ক্ষেত্রে পুনরাবৃত্তি করছে এমন কোনও উপাদান নেই। এটি সর্বনিম্ন আইটেমটি ফিরিয়ে দিচ্ছে। আমরা কি এমন কিছু করতে পারি যাতে এটি এমন ক্ষেত্রে শূন্য বা নাল ফেরায়।
বিক্রেত রানা

12

এর শক্তিশালী সরলীকৃত সংস্করণ max:

def max(items, key=lambda x: x):
    current = item[0]
    for item in items:
        if key(item) > key(current):
            current = item
    return current

ল্যাম্বদা সম্পর্কিত:

>>> ident = lambda x: x
>>> ident(3)
3
>>> ident(5)
5

>>> times_two = lambda x: 2*x
>>> times_two(2)
4

10

সর্বোচ্চ ফাংশন কীভাবে কাজ করে?

এটি পুনরাবৃত্তির মধ্যে "বৃহত্তম" আইটেমটির সন্ধান করে। আমি ধরে নেব যে এটি কী তা আপনি সন্ধান করতে পারবেন তবে তা যদি না হয় তবে এটি এমন কিছু যা আপনি লুপ করতে পারেন, অর্থাত্ একটি তালিকা বা স্ট্রিং।

সর্বাধিক ফাংশনে কীওয়ার্ড কী ব্যবহার করা যায়? আমি জানি এটি বাছাই ফাংশনের প্রসঙ্গেও ব্যবহৃত হয়

Keyল্যাম্বডা ফাংশন যা জানাবে যে maxপুনরাবৃত্তকারীগুলিতে কোন জিনিসগুলি অন্যের চেয়ে বড়। আপনি যদি নিজেকে তৈরি করেছেন এমন কোনও বস্তু বাছাই করছিলেন এবং পূর্ণসংখ্যার মতো সুস্পষ্ট কিছু নয়, তা বলুন।

লাম্বদা অভিব্যক্তির অর্থ? সেগুলি কীভাবে পড়বেন? তারা কিভাবে কাজ করে?

এটি একটি বৃহত্তর প্রশ্নের সাজানোর। সরল ভাষায়, একটি ল্যাম্বডা এমন একটি ফাংশন যা আপনি চারপাশে পাস করতে পারেন এবং কোডের অন্যান্য টুকরা ব্যবহার করতে পারেন। উদাহরণস্বরূপ এটি নিন:

def sum(a, b, f):
    return (f(a) + f(b))

এটি দুটি অবজেক্ট aএবং b, এবং একটি ফাংশন লাগে f। এটি f()প্রতিটি বস্তুর জন্য কল করে, তারপর সেগুলি একসাথে যুক্ত করে। সুতরাং এই কল দেখুন:

>>> sum(2, 2, lambda a:  a * 2)
8

sum()নেয় 2এবং এতে ল্যাম্বডা এক্সপ্রেশনটি কল করে। তাই f(a)হয়ে 2 * 2, যা হয়ে 4. এটা তারপর জন্য এই আছে b, এবং দুটি একসাথে যোগ করে।

এত সহজ শর্তে নয়, ল্যাম্বডাস ল্যাম্বডা ক্যালকুলাস থেকে আসে, যা কোনও ফাংশনটির ধারণা যা কোনও ফাংশন ফিরিয়ে দেয়; গণনা প্রকাশের জন্য একটি খুব শীতল গণিত ধারণা। আপনি এখানে সে সম্পর্কে পড়তে পারেন , এবং তারপরে এটি এখানে বুঝতে পারবেন ।

এটি সম্পর্কে আরও কিছুটা পড়ার পরে সম্ভবত আরও ভাল, যেহেতু ল্যাম্বডাস বিভ্রান্তিকর হতে পারে, এবং এটি তত্ক্ষণাত স্পষ্ট নয় যে তারা কতটা কার্যকর। এখানে চেক করুন


7

maxএকটি থেকে সর্বাধিক আউট পেতে ফাংশনটি ব্যবহৃত হয় iterable

পুনরুক্তিকারীগুলি তালিকা, টিপলস, ডিক অবজেক্টস ইত্যাদি হতে পারে বা আপনার সরবরাহিত উদাহরণ হিসাবে কাস্টম অবজেক্টও হতে পারে।

max(iterable[, key=func]) -> value
max(a, b, c, ...[, key=func]) -> value

With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.

সুতরাং, key=funcমূলত আমাদের keyফাংশনে একটি alচ্ছিক যুক্তি পাস করার অনুমতি দেয় যার ভিত্তিতে প্রদত্ত পুনরাবৃত্তি / আর্গুমেন্টগুলি সাজানো হয় এবং সর্বাধিক ফিরে আসে।

lambdaপাইথন কীওয়ার্ড যা সিউডো ফাংশন হিসাবে কাজ করে। সুতরাং, আপনি যখন playerএটি আপত্তি পাস করবেন, এটি ফিরে আসবে player.totalScore। সুতরাং, পুনরাবৃত্তিটি ফাংশনটি অতিক্রম করা তার দেওয়া সামগ্রীর মোট স্কোরmax অনুসারে বাছাই করবে এবং যার সর্বাধিক রয়েছে তাকে ফিরিয়ে দেবে ।key playerplayertotalScore

যদি কোনও keyযুক্তি সরবরাহ না করা হয়, সর্বাধিক ডিফল্ট পাইথন অর্ডারিং অনুসারে ফিরে আসে।

উদাহরণ -

max(1, 3, 5, 7)
>>>7
max([1, 3, 5, 7])
>>>7

people = [('Barack', 'Obama'), ('Oprah', 'Winfrey'), ('Mahatma', 'Gandhi')]
max(people, key=lambda x: x[1])
>>>('Oprah', 'Winfrey')

6

ডকুমেন্টেশন অনুযায়ী :

সর্বাধিক (পুনরাবৃত্তিযোগ্য [, কী])
সর্বাধিক (আরগ 1, আরগ 2, * আরগস [, কী])
বৃহত্তম বা দ্বিতীয় বা ততোধিক যুক্তির বৃহত্তমতম আইটেমটি প্রত্যাবর্তনযোগ্য Return

যদি একটি অবস্থানগত আর্গুমেন্ট সরবরাহ করা হয় তবে পুনরাবৃত্তযোগ্যটি অবশ্যই একটি খালি খালি পুনরাবৃত্তিযোগ্য (যেমন একটি শূন্য খালি স্ট্রিং, টিপল বা তালিকা)। পুনরাবৃত্তির বৃহত্তম আইটেমটি ফিরে আসে। যদি দুটি বা ততোধিক অবস্থানিক যুক্তি সরবরাহ করা হয় তবে অবস্থানগত আর্গুমেন্টগুলির মধ্যে বৃহত্তম ফিরে আসে।

Keyচ্ছিক কী যুক্তি তালিকা.সোর্ট () এর জন্য ব্যবহৃত এমন এক-যুক্তির অর্ডার ক্রিয়াকে নির্দিষ্ট করে। মূল যুক্তি যদি সরবরাহ করা হয় তবে অবশ্যই কীওয়ার্ড ফর্মের মধ্যে থাকতে হবে (উদাহরণস্বরূপ, সর্বোচ্চ (a, b, c, key = func)।

এটি যা বলছে তা হ'ল এই ক্ষেত্রে, আপনি একটি তালিকা সরবরাহ করছেন players। তারপরে maxফাংশনটি তালিকার সমস্ত আইটেমের সাথে পুনরাবৃত্তি করবে এবং একটি "সর্বোচ্চ" পেতে একে অপরের সাথে তুলনা করবে।

আপনি যেমন কল্পনা করতে পারেন, playerতুলনা করার জন্য এর মূল্য নির্ধারণের মতো জটিল কোনও বিষয়টি জটিল, সুতরাং আপনাকে keyকীভাবে maxকার্যকারিতা প্রতিটিটির মান নির্ধারণ করবে তা নির্ধারণ করার জন্য আপনাকে যুক্তি দেওয়া হবে player। এই ক্ষেত্রে, আপনি ল্যাম্বডা ফাংশনটি "প্রত্যেকের pজন্য playersপেতে p.totalscoreএবং তুলনার জন্য এটির মান হিসাবে" ব্যবহার করতে ব্যবহার করছেন।


3

maxএমন ফাংশনে নির্মিত যা প্রথম আর্গুমেন্টটিকে একটি iterable(যেমন তালিকা বা টিপল) গ্রহণ করে

কীওয়ার্ড আর্গুমেন্টের keyএটির ডিফল্ট মান থাকে Noneতবে এটি মূল্যায়ন করতে ফাংশনটি গ্রহণ করে, এটিকে মোড়ক হিসাবে বিবেচনা করে যা ফাংশনের উপর ভিত্তি করে পুনরাবৃত্তিকে মূল্যায়ন করে

এই উদাহরণ অভিধান বিবেচনা করুন:

d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}

উদা:

>>> max(d.keys())
'sword'

আপনি দেখতে পাচ্ছেন যে আপনি কেবল কোয়ার্গ ছাড়াই পুনরাবৃত্তিযোগ্য (যদি একটি ফাংশন key) পাস করেন তবে এটি কী-এর সর্বাধিক মান (বর্ণানুক্রমিক) প্রত্যাবর্তন করছে

যাত্রা। বর্ণমালার ভিত্তিতে কীটির সর্বাধিক মান সন্ধানের পরিবর্তে আপনার কী দৈর্ঘ্যের দ্বারা সর্বাধিক কী সন্ধান করতে হবে:

>>>max(d.keys(), key=lambda x: len(x))
'artwork'

এই উদাহরণে লাম্বদা ফাংশনটি মূল দৈর্ঘ্য ফিরিয়ে দিচ্ছে যা বর্ণের পরিবর্তে মানগুলি মূল্যায়নের পরিবর্তে মানগুলি মূল্যায়নের সময় পুনরুক্ত করা হবে এটি সর্বোচ্চ দৈর্ঘ্যের কী এবং রিটার্ন কীটির সর্বাধিক দৈর্ঘ্যের উপর নজর রাখবে key

যাত্রা।

>>> max(d.keys(), key=lambda x: d[x])
'friend'

এই উদাহরণে লাম্বদা ফাংশনটি সংশ্লিষ্ট অভিধান কীটির মান ফিরিয়ে দিচ্ছে যার সর্বাধিক মান রয়েছে

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