আমি sorted()
যুক্তির পিছনের বাক্য গঠনটি বেশ বুঝতে পারি না :
key=lambda variable: variable[0]
lambda
নির্বিচারে না ? এর variable
মতো দেখতে দু'বার কেন বলা হয়েছে dict
?
আমি sorted()
যুক্তির পিছনের বাক্য গঠনটি বেশ বুঝতে পারি না :
key=lambda variable: variable[0]
lambda
নির্বিচারে না ? এর variable
মতো দেখতে দু'বার কেন বলা হয়েছে dict
?
উত্তর:
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
এখানে দুবার ব্যবহার করা হয়েছে কারণ কোলনের বাম দিকে এটি একটি প্যারামিটারের নাম এবং ডানদিকে এটি কোনও কিছু গণনা করার জন্য কোড ব্লকে ব্যবহার করা হচ্ছে।
আমি মনে করি যে এখানে সমস্ত উত্তরগুলি ল্যাম্বডা ফাংশনটি সাজানো () এর প্রেক্ষাপটে বেশ সুন্দরভাবে কী করেছে তার মূল অংশটি কভার করে, তবে আমি এখনও এমন বিবরণের মতো বোধ করি যা একটি স্বজ্ঞাত বোঝার অভাব বোধ করে, তাই এখানে আমার দুটি সেন্ট রয়েছে।
সম্পূর্ণতার জন্য, আমি সুস্পষ্ট আপ ফ্রন্টটি বর্ণনা করব: বাছাই করা () বাছাই করা উপাদানগুলির একটি তালিকা প্রত্যাবর্তন করে এবং যদি আমরা একটি নির্দিষ্ট পদ্ধতিতে বাছাই করতে চাই বা উপাদানগুলির একটি জটিল তালিকা বাছাই করতে চাই (যেমন নেস্টেড তালিকা বা টিপলগুলির একটি তালিকা) আমরা মূল যুক্তিটি উপস্থাপন করতে পারি।
আমার জন্য, মূল যুক্তির অন্তর্নিহিত বোধগম্যতা, কেন এটি কল করতে হবে এবং লাম্বদা ব্যবহার করার জন্য (বেনামে) কলযোগ্য ফাংশন এটি দুটি অংশে আসে two
ল্যাম্বদা সিনট্যাক্সটি নিম্নরূপ:
ল্যামডা 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'
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)]
এই কোডটি চালান, এবং আপনি দেখতে পাবেন যে এটি আদেশ। পূর্ণসংখ্যার একটি তালিকা সূচিকাগুলি ব্যবহার করে দেখুন আপনি কোডটি বিরতি পেয়েছেন।
এটি একটি দীর্ঘ ঘোরানো ব্যাখ্যা ছিল, তবে আমি আশা করি যে এটি ল্যাম্বডা ফাংশনগুলির ব্যবহারের উপর ভিত্তি করে সাজানো () এবং এর বাইরে মূল আর্গুমেন্ট হিসাবে আপনার স্বীকৃতিটিকে 'বাছাই' করতে সহায়তা করে।
key
ফাংশনের পিছনের ধারণাটি আমার কাছে পরিষ্কার ছিল না । আপনি যদি sorted
ফাংশনটি বোঝার চেষ্টা করছেন তবে এগুলি lambda
সিনট্যাক্সটি কেবল বোঝার পথে চলে যায়।
lambda
পাইথন কীওয়ার্ড যা বেনামে ফাংশন তৈরি করতে ব্যবহৃত হয় ।
>>> (lambda x: x+2)(3)
5
3
কারণ এটি কোনও ফাংশনে দেওয়া হচ্ছে। পেরেনগুলি ল্যাম্বদার চারপাশে রয়েছে যাতে এক্সপ্রেশনটি পার্স করা যায় না lambda x: x+2(3)
, যা 2
কোনও ফাংশন নয় বলে অবৈধ ।
ব্যবহারের আরও একটি উদাহরণ কী (ল্যাম্বদা ) এর সাথে সাজানো () ফাংশন। আসুন আপনার বিবেচনার জন্য টিউপসগুলির একটি তালিকা রয়েছে। প্রতিটি টিপলটিতে আপনার গাড়ির একটি ব্র্যান্ড, মডেল এবং ওজন থাকে এবং আপনি ব্র্যান্ড, মডেল বা ওজন অনুসারে টিপলগুলির এই তালিকাটি বাছাই করতে চান। আপনি এটি ল্যাম্বদা দিয়ে করতে পারেন।
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)]
যেহেতু ল্যাম্বডা ব্যবহারের প্রসঙ্গে জিজ্ঞাসা করা হয়েছিল, তাই এটিও sorted()
দেখুন https://wiki.python.org/moin/HowTo/Sorting/#Key_Funtions
কেবল পুনরায় প্রেরণে, কী (ptionচ্ছিক। আদেশটি নির্ধারণের জন্য কার্যকর করার একটি ফাংশন Def ডিফল্ট কোনওটি নয়) সাজানো ফাংশনে একটি ফাংশন প্রত্যাশা করে এবং আপনি লাম্বদা ব্যবহার করেন।
ল্যাম্বদা সংজ্ঞায়িত করতে, আপনি যে বস্তুর সম্পত্তিটি বাছাই করতে চান তা নির্দিষ্ট করে দেন এবং পাইথনের বিল্ট-ইন বাছাই করা ফাংশনটি স্বয়ংক্রিয়ভাবে এটির যত্ন নেবে।
আপনি যদি একাধিক বৈশিষ্ট্য অনুসারে বাছাই করতে চান তবে কী = ল্যাম্বদা এক্স: (সম্পত্তি 1, সম্পত্তি 2) বরাদ্দ করুন।
অর্ডার-বাই নির্দিষ্ট করার জন্য, তৃতীয় আর্গুমেন্ট হিসাবে বিপরীত = সত্যটি পাস করুন (alচ্ছিক। একটি বুলিয়ান Fal
জিজ্ঞাসিত প্রশ্নের সাথে প্রাসঙ্গিক উদাহরণ সহ সহজ এবং সময় সাশ্রয়ী উত্তর এই উদাহরণটি অনুসরণ করুন:
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}]
বয়স অনুসারে বাছাই করে এবং তাই বর্ধনের ক্রম অনুসারে তালিকাটি ফিরে আসে।
আরও ভাল বোঝার জন্য এই কোড ব্যবহার করে দেখুন।
def
।