সাজানো পেছনের সিনট্যাক্স (কী = ল্যাম্বদা:…)


152

আমি sorted()যুক্তির পিছনের বাক্য গঠনটি বেশ বুঝতে পারি না :

key=lambda variable: variable[0]

lambdaনির্বিচারে না ? এর variableমতো দেখতে দু'বার কেন বলা হয়েছে dict?

উত্তর:


162

keyএটি এমন একটি ফাংশন যা সংগ্রহের আইটেমগুলির তুলনা করার আগে তাকে রূপান্তর করতে ডাকা হবে। যে প্যারামিটারটি পাস করেছে তা keyঅবশ্যই কলযোগ্য be

এর ব্যবহার lambdaএকটি বেনামে ফাংশন তৈরি করে (যা কলযোগ্য)। sortedকলযোগ্য ক্ষেত্রে কেবলমাত্র একটি পরামিতি লাগে। পাইথন lambdaখুব সহজ। এটি কেবলমাত্র একটি জিনিস সত্যিই ফিরে আসতে পারে।

এর বাক্য গঠনটি lambdaহল শব্দটির lambdaপরে পরামিতিগুলির নামের তালিকা এবং তারপরে কোডের একক ব্লক। পরামিতি তালিকা এবং কোড ব্লক কোলন দ্বারা বর্ণিত হয়। এটি পাইথনের অন্যান্য নির্মাণের মতো while, যেমন for, ifএবং আরও কিছু। এগুলি সমস্ত বিবৃতি যা সাধারণত একটি কোড ব্লক থাকে। কোড ব্লক সহ ল্যাম্বদা হ'ল একটি বিবৃতির অন্য উদাহরণ।

একটি ফাংশন তৈরি করতে আমরা ডিএফ এর সাথে ল্যাম্বডা ব্যবহারের তুলনা করতে পারি।

adder_lambda = lambda parameter1,parameter2: parameter1+parameter2
def adder_regular(parameter1, parameter2): return parameter1+parameter2

ল্যাম্বদা কেবল একটি নাম নির্দিষ্ট না করে আমাদের এটি করার একটি উপায় দেয়। যা কোনও ফাংশনের পরামিতি হিসাবে ব্যবহারের জন্য এটি দুর্দান্ত করে তোলে।

variable এখানে দুবার ব্যবহার করা হয়েছে কারণ কোলনের বাম দিকে এটি একটি প্যারামিটারের নাম এবং ডানদিকে এটি কোনও কিছু গণনা করার জন্য কোড ব্লকে ব্যবহার করা হচ্ছে।


10
দ্রষ্টব্য (ওপিকে): এটি কোনও নামের জন্য ল্যাম্বডা বরাদ্দ করা এড়ানো উচিত (যেমন এটি বেনামে ফাংশন হিসাবে অন্য কোনও উপায়ে ব্যবহার করা)। আপনি যদি নিজেকে এটি করতে দেখেন তবে আপনার সম্ভবত একটি ব্যবহার করা উচিত def
Wim

151

আমি মনে করি যে এখানে সমস্ত উত্তরগুলি ল্যাম্বডা ফাংশনটি সাজানো () এর প্রেক্ষাপটে বেশ সুন্দরভাবে কী করেছে তার মূল অংশটি কভার করে, তবে আমি এখনও এমন বিবরণের মতো বোধ করি যা একটি স্বজ্ঞাত বোঝার অভাব বোধ করে, তাই এখানে আমার দুটি সেন্ট রয়েছে।

সম্পূর্ণতার জন্য, আমি সুস্পষ্ট আপ ফ্রন্টটি বর্ণনা করব: বাছাই করা () বাছাই করা উপাদানগুলির একটি তালিকা প্রত্যাবর্তন করে এবং যদি আমরা একটি নির্দিষ্ট পদ্ধতিতে বাছাই করতে চাই বা উপাদানগুলির একটি জটিল তালিকা বাছাই করতে চাই (যেমন নেস্টেড তালিকা বা টিপলগুলির একটি তালিকা) আমরা মূল যুক্তিটি উপস্থাপন করতে পারি।

আমার জন্য, মূল যুক্তির অন্তর্নিহিত বোধগম্যতা, কেন এটি কল করতে হবে এবং লাম্বদা ব্যবহার করার জন্য (বেনামে) কলযোগ্য ফাংশন এটি দুটি অংশে আসে two

  1. লাম্বা ব্যবহার করে শেষ অবধি আপনাকে একটি সম্পূর্ণ ফাংশন লিখতে (সংজ্ঞায়িত) করতে হবে না, যেমন একটি sblom উদাহরণ সরবরাহ করেছে। ল্যাম্বদা ফাংশনগুলি তৈরি করা হয়, ব্যবহৃত হয় এবং তত্ক্ষণাত ধ্বংস হয়ে যায় - তাই তারা আপনার কোডটি আরও কোড দিয়ে সজ্জিত করে না যা কেবল একবারই ব্যবহৃত হবে। এটি, যেমন আমি এটি বুঝতে পারি, ল্যাম্বডা ফাংশনের মূল ইউটিলিটি এবং এরূপ ভূমিকার জন্য এর অ্যাপ্লিকেশনগুলি বিস্তৃত। এর বাক্য গঠনটি নিখুঁতভাবে কনভেনশন দ্বারা হয়, যা মূলত সাধারণভাবে প্রোগ্রামেটিক সিনট্যাক্সের প্রকৃতি। বাক্য গঠন শিখুন এবং এটি দিয়ে সম্পন্ন করুন।

ল্যাম্বদা সিনট্যাক্সটি নিম্নরূপ:

ল্যামডা input_variable (গুলি) : সুস্বাদু এক মাছ ধরার নৌকা

যেমন

In [1]: f00 = lambda x: x/2

In [2]: f00(10)
Out[2]: 5.0

In [3]: (lambda x: x/2)(10)
Out[3]: 5.0

In [4]: (lambda x, y: x / y)(10, 2)
Out[4]: 5.0

In [5]: (lambda: 'amazing lambda')() # func with no args!
Out[5]: 'amazing lambda'
  1. তর্কটির পিছনে ধারণাটি keyহ'ল এটি নির্দেশাবলীর একটি সেট গ্রহণ করা উচিত যা তালিকার জন্য প্রয়োজনীয় উপাদানগুলির তালিকাগুলিতে 'সাজানো ()' ফাংশনটি মূলত নির্দেশ করবে। যখন এটি বলে key=, এর সত্যিকারের অর্থটি হ'ল: আমি তালিকার মাধ্যমে একবারে একটি উপাদানকে পুনরুক্ত করি (উদাহরণস্বরূপ ই তালিকার জন্য), আমি মূল তর্কটি সরবরাহ করে ফাংশনটিতে আমি বর্তমান উপাদানটি পাস করব এবং এটি ব্যবহার করব একটি রূপান্তরিত তালিকা তৈরি করতে যা আমাকে চূড়ান্ত বাছাই করা তালিকার আদেশে অবহিত করবে।

এটা দেখ:

mylist = [3,6,3,2,4,8,23]
sorted(mylist, key=WhatToSortBy)

বেস উদাহরণ:

sorted(mylist)

[2, 3, 3, 4, 6, 8, 23] # সমস্ত সংখ্যা ছোট থেকে বড় পর্যন্ত ক্রমযুক্ত।

উদাহরণ 1:

mylist = [3,6,3,2,4,8,23]
sorted(mylist, key=lambda x: x%2==0)

[3, 3, 23, 6, 2, 4, 8] # এই বাছাই করা ফলাফলটি কি আপনাকে স্বজ্ঞাত জ্ঞান দেয়?

লক্ষ্য করুন যে আমার ল্যাম্বদা ফাংশনটি বাছাই করার আগে (ঙ) সমান বা বিজোড় ছিল কিনা তা পরীক্ষা করে বাছাই করতে বলেছে।

কিন্তু অপেক্ষা করো! আপনি (বা সম্ভবত) দুটি জিনিস ভাবতে পারেন - প্রথমত, আমার সন্ধ্যাগুলির আগে আমার প্রতিক্রিয়া কেন আসছে (যেহেতু আমার মূল মানটি আমার অপরিবর্তিত ফাংশনটিকে মোড অপারেটরটি ব্যবহার করে সন্ধ্যাগুলির অগ্রাধিকার দিতে বলছে বলে মনে হচ্ছে x%2==0)। দ্বিতীয়ত, আমার সন্ধ্যাগুলি ক্রমবর্ধমান কেন? 2 ঠিক 6 আগে আসে? এই ফলাফলটি বিশ্লেষণ করে আমরা বাছাই করা () 'কী' যুক্তিটি কীভাবে কাজ করে বিশেষত বেনাম ল্যাম্বডা ফাংশনের সাথে একত্রে আরও গভীর কিছু শিখব।

প্রথমত, আপনি লক্ষ্য করবেন যে সন্ধ্যাগুলির আগে প্রতিক্রিয়াগুলি আসার পরে, সন্ধ্যাগুলি নিজেরাই সাজানো হয় না। কেন?? দস্তাবেজগুলি পড়তে দিন :

মূল ফাংশন পাইথন ২.৪ দিয়ে শুরু করে, উভয় list.sort () এবং সাজানো () একটি তুলনা করার আগে প্রতিটি তালিকার উপাদানটিতে কল করতে একটি ফাংশন নির্দিষ্ট করার জন্য একটি মূল প্যারামিটার যুক্ত করেছে।

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

সুতরাং উদাহরণস্বরূপ একটি মডুলো ব্যবহার করে কি ফিরে আসে? একটি বুলিয়ান মান: True == 1, False == 0। তাহলে কীভাবে এই কীটি বাছাই করা যায়? এটি মূলত মূল তালিকাটিকে 1 ও 0 এর ক্রমিকায় রূপান্তর করে।

[3,6,3,2,4,8,23] হয়ে যায় [0,1,0,1,1,1,0]

এখন আমরা কোথাও পাচ্ছি। আপনি রূপান্তরিত তালিকাটি বাছাই করলে আপনি কী পাবেন?

[0,0,0,1,1,1,1]

ঠিক আছে, সুতরাং এখন আমরা জানি কেন সন্ধ্যা হওয়ার আগে প্রতিকূলতা আসে। তবে পরের প্রশ্নটি হল: 6 টি এখনও আমার চূড়ান্ত তালিকার 2 এর আগে আসে কেন? আচ্ছা এটি সহজ - কারণ কারণ বাছাই করা কেবল একবারই ঘটে! যেমন 1 1 টি এখনও মূল তালিকার মানগুলি উপস্থাপন করে যা একে অপরের সাথে তুলনামূলকভাবে তাদের মূল অবস্থানগুলিতে। যেহেতু বাছাই কেবল একবার হয়, এবং আমরা মূল থেকে নীচ থেকে উচ্চ পর্যন্ত অর্ডার করার জন্য কোনও ধরণের ক্রম ফাংশন বলি না, সেগুলি মানগুলি একে অপরের সাথে সম্পর্কিত তাদের মূল ক্রমে থাকে order

চূড়ান্ত প্রশ্নটি হ'ল: আমি চূড়ান্ত অনুসারে বাছাই করা তালিকাটি ছাপানোর পরে আমার বুলিয়ান মানগুলির ক্রমটি মূল মানগুলিতে ফিরে আসে কীভাবে তা সম্পর্কে আমি কীভাবে ধারণা করব?

বাছাই করা () একটি অন্তর্নির্মিত পদ্ধতি যা (মজাদার ঘটনা) টিমসোর্ট নামে একটি হাইব্রিড বাছাই অ্যালগরিদম ব্যবহার করেএটি মার্জ বাছাই এবং সন্নিবেশ সাজানোর দিকগুলি একত্রিত করে। আমার কাছে এটি স্পষ্ট বলে মনে হয় যে আপনি যখন এটিকে ডাকবেন, এমন একটি যান্ত্রিক রয়েছে যা এই মানগুলিকে স্মৃতিতে ধারণ করে এবং ল্যাম্বডা ফাংশন দ্বারা (...!) দ্বারা নির্ধারিত তাদের বুলিয়ান পরিচয় (মুখোশ) দিয়ে তাদের বান্ডিল করে। ল্যাম্বদা ফাংশন থেকে গণনা করা তাদের বুলিয়ান পরিচয় দিয়ে অর্ডারটি নির্ধারিত হয় তবে মনে রাখবেন যে এই সাবলিস্টগুলি (কারও এবং শূন্যের) নিজের মুল মান অনুসারে বাছাই করা হয়নি। সুতরাং, চূড়ান্ত তালিকাটি ওডস এবং ইভেন্টগুলি দ্বারা সংগঠিত হয়ে সাব-লিস্ট অনুসারে বাছাই করা হয় না (এই ক্ষেত্রে সন্ধ্যাগুলি ক্রমবর্ধমান হয়)। বৈষম্যগুলি অর্ডার করার বিষয়টি হ'ল কারণ তারা ইতিমধ্যে মূল তালিকায় কাকতালীয়ভাবে क्रमবদ্ধ ছিল। এই সমস্ত থেকে গ্রহণযোগ্যতা হ'ল ল্যাম্বদা যখন সেই রূপান্তরটি করে, তখন সাবলিস্টগুলির মূল ক্রম বজায় থাকে।

তাহলে কীভাবে এই সমস্ত মূল প্রশ্নের সাথে সম্পর্কিত এবং আরও গুরুত্বপূর্ণভাবে, আমাদের কীভাবে আমাদের মূল যুক্তি এবং ল্যাম্বদা দিয়ে সাজানো () প্রয়োগ করতে হবে সে সম্পর্কে আমাদের অন্তর্নিহিততা?

সেই ল্যাম্বডা ফাংশনটিকে পয়েন্টার হিসাবে ভাবা যেতে পারে যা আমাদের অনুসারে যে মানগুলি বাছাই করতে হবে তার দিকে নির্দেশ করে, লম্বা ফাংশন দ্বারা পরিবর্তিত রূপান্তরিত তার বুলিয়ানে কোনও পয়েন্টার ম্যাপিং করছে কিনা, বা যদি এটি নেস্টেড তালিকার কোনও নির্দিষ্ট উপাদান, টুপল, ডিক, ইত্যাদি, আবার ল্যাম্বদা ফাংশন দ্বারা নির্ধারিত।

আসুন চেষ্টা করুন এবং পূর্বাভাস দেওয়া যাক আমি যখন নিম্নলিখিত কোডটি চালাই তখন কী ঘটে।

mylist = [(3, 5, 8), (6, 2, 8), ( 2, 9, 4), (6, 8, 5)]
sorted(mylist, key=lambda x: x[1])

আমার sortedকলটি স্পষ্টতই বলে, "দয়া করে এই তালিকাটি বাছাই করুন"। মূল যুক্তিটি মাইলিস্টে প্রতিটি এলিমেন্টের (x) বলে, আরও কিছু নির্দিষ্ট করে তোলে , সেই উপাদানের 1 সূচক ফেরত দিন , তারপরে মূল তালিকা 'মাইলিস্ট' এর সমস্ত উপাদানকে তালিকা অনুসারে বাছাই করে সাজান ল্যাম্বদা ফাংশন। যেহেতু আমাদের টিপলগুলির একটি তালিকা রয়েছে, তাই আমরা এই টিপল থেকে একটি সূচক উপাদানটি ফিরে আসতে পারি। সুতরাং আমরা পেতে:

[(6, 2, 8), (3, 5, 8), (6, 8, 5), (2, 9, 4)]

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

এটি একটি দীর্ঘ ঘোরানো ব্যাখ্যা ছিল, তবে আমি আশা করি যে এটি ল্যাম্বডা ফাংশনগুলির ব্যবহারের উপর ভিত্তি করে সাজানো () এবং এর বাইরে মূল আর্গুমেন্ট হিসাবে আপনার স্বীকৃতিটিকে 'বাছাই' করতে সহায়তা করে।


8
চমৎকার এবং ব্যাপক ব্যাখ্যা। এই উত্তরটি 100 পয়েন্টের দাবিদার। তবে আমি ভাবছি কেন এই উত্তরটির চেয়ে পছন্দ কম।
জাভেদ হয়েছে

3
গভীর ব্যাখ্যার জন্য আপনাকে ধন্যবাদ। আমি ডকগুলি পড়েছি এবং কীভাবে তা বাছাই করেছি এবং এটি keyফাংশনের পিছনের ধারণাটি আমার কাছে পরিষ্কার ছিল না । আপনি যদি sortedফাংশনটি বোঝার চেষ্টা করছেন তবে এগুলি lambdaসিনট্যাক্সটি কেবল বোঝার পথে চলে যায়।
সানবার

3
এটি এখানে সেরা ব্যাখ্যা। এটি আসলে কীভাবে কাজ করে তা আমাকে বুঝতে সাহায্য করার জন্য এটি সত্যিই দরকারী ছিল - আমি ল্যাম্বদা ফাংশনটি বাছাই করেছিলাম, তবে সাজানো () এর প্রসঙ্গে এটি ব্যবহার করার কোনও অর্থ নেই। এটি সত্যিই সাহায্য করেছে, ধন্যবাদ!
TGWaffles

2
এটি একটি উজ্জ্বল উত্তর। স্যালুট ইউ স্যার।
রাজেশ মপ্পু

2
স্ট্যাক ওভারফ্লোতে এটি আমার প্রিয় একটি উত্তর। ধন্যবাদ!
এডিআর

26

lambdaপাইথন কীওয়ার্ড যা বেনামে ফাংশন তৈরি করতে ব্যবহৃত হয় ।

>>> (lambda x: x+2)(3)
5

2
কেন প্রতিটি কাছাকাছি বন্ধনী আছে?
ক্রিস্টোফার মার্কিয়েটা 23'12

19
পেরেনগুলি প্রায় রয়েছে 3কারণ এটি কোনও ফাংশনে দেওয়া হচ্ছে। পেরেনগুলি ল্যাম্বদার চারপাশে রয়েছে যাতে এক্সপ্রেশনটি পার্স করা যায় না lambda x: x+2(3), যা 2কোনও ফাংশন নয় বলে অবৈধ ।
Ignacio Vazquez-Abram 3

আমি নিশ্চিত নই যে আমি "বেনামে" শব্দটি পছন্দ করি। মানে, এটি সত্য যে তাদের নাম নেই, সুতরাং বেনামে "প্রযুক্তিগতভাবে" নির্ভুল accurate আমি বরং তাদের "অস্থায়ী কার্যাদি" হিসাবে উল্লেখ করব। তবে, আমি একজন প্যাডেন্ট।
ব্যবহারকারী5179531

12

এর variableবাম দিকের :একটি প্যারামিটারের নাম। ব্যবহারের variableডান দিকে পরামিতি ব্যবহার করছে।

মানে প্রায় ঠিক একই রকম:

def some_method(variable):
  return variable[0]

5

ব্যবহারের আরও একটি উদাহরণ কী (ল্যাম্বদা ) এর সাথে সাজানো () ফাংশন। আসুন আপনার বিবেচনার জন্য টিউপসগুলির একটি তালিকা রয়েছে। প্রতিটি টিপলটিতে আপনার গাড়ির একটি ব্র্যান্ড, মডেল এবং ওজন থাকে এবং আপনি ব্র্যান্ড, মডেল বা ওজন অনুসারে টিপলগুলির এই তালিকাটি বাছাই করতে চান। আপনি এটি ল্যাম্বদা দিয়ে করতে পারেন।

cars = [('citroen', 'xsara', 1100), ('lincoln', 'navigator', 2000), ('bmw', 'x5', 1700)]

print(sorted(cars, key=lambda car: car[0]))
print(sorted(cars, key=lambda car: car[1]))
print(sorted(cars, key=lambda car: car[2]))

ফলাফল:

[('bmw', 'x5', '1700'), ('citroen', 'xsara', 1100), ('lincoln', 'navigator', 2000)]
[('lincoln', 'navigator', 2000), ('bmw', 'x5', '1700'), ('citroen', 'xsara', 1100)]
[('citroen', 'xsara', 1100), ('bmw', 'x5', 1700), ('lincoln', 'navigator', 2000)]

3

lambdaএকটি বেনামি ফাংশন, একটি স্বেচ্ছাসেবী ফাংশন নয়। প্যারামিটারটি স্বীকৃত হ'ল আপনি যে ভেরিয়েবলটির সাথে কাজ করছেন তা হবে এবং আপনি যে কলামটিতে এটি সাজিয়ে রেখেছেন।



1

কেবল পুনরায় প্রেরণে, কী (ptionচ্ছিক। আদেশটি নির্ধারণের জন্য কার্যকর করার একটি ফাংশন Def ডিফল্ট কোনওটি নয়) সাজানো ফাংশনে একটি ফাংশন প্রত্যাশা করে এবং আপনি লাম্বদা ব্যবহার করেন।

ল্যাম্বদা সংজ্ঞায়িত করতে, আপনি যে বস্তুর সম্পত্তিটি বাছাই করতে চান তা নির্দিষ্ট করে দেন এবং পাইথনের বিল্ট-ইন বাছাই করা ফাংশনটি স্বয়ংক্রিয়ভাবে এটির যত্ন নেবে।

আপনি যদি একাধিক বৈশিষ্ট্য অনুসারে বাছাই করতে চান তবে কী = ল্যাম্বদা এক্স: (সম্পত্তি 1, সম্পত্তি 2) বরাদ্দ করুন।

অর্ডার-বাই নির্দিষ্ট করার জন্য, তৃতীয় আর্গুমেন্ট হিসাবে বিপরীত = সত্যটি পাস করুন (alচ্ছিক। একটি বুলিয়ান Fal


1

জিজ্ঞাসিত প্রশ্নের সাথে প্রাসঙ্গিক উদাহরণ সহ সহজ এবং সময় সাশ্রয়ী উত্তর এই উদাহরণটি অনুসরণ করুন:

 user = [{"name": "Dough", "age": 55}, 
            {"name": "Ben", "age": 44}, 
            {"name": "Citrus", "age": 33},
            {"name": "Abdullah", "age":22},
            ]
    print(sorted(user, key=lambda el: el["name"]))
    print(sorted(user, key= lambda y: y["age"]))

তালিকার নামগুলি দেখুন, সেগুলি ডি, বি, সি এবং এ দিয়ে শুরু হয় এবং আপনি যদি বয়সগুলি লক্ষ্য করেন তবে এগুলি 55, 44, 33 এবং 22 The প্রথম মুদ্রণ কোড

print(sorted(user, key=lambda el: el["name"]))

এর ফলাফল:

[{'name': 'Abdullah', 'age': 22}, 
{'name': 'Ben', 'age': 44}, 
{'name': 'Citrus', 'age': 33}, 
{'name': 'Dough', 'age': 55}]

নামটি বাছাই করে, কারণ কী দ্বারা = ল্যাম্বদা এল: এল ["নাম"] আমরা নামগুলি বাছাই করছি এবং নামগুলি বর্ণানুক্রমিক ক্রমে ফিরে আসে।

দ্বিতীয় প্রিন্ট কোড

print(sorted(user, key= lambda y: y["age"]))

ফলাফল:

[{'name': 'Abdullah', 'age': 22},
 {'name': 'Citrus', 'age': 33},
 {'name': 'Ben', 'age': 44}, 
 {'name': 'Dough', 'age': 55}]

বয়স অনুসারে বাছাই করে এবং তাই বর্ধনের ক্রম অনুসারে তালিকাটি ফিরে আসে।

আরও ভাল বোঝার জন্য এই কোড ব্যবহার করে দেখুন।

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