এখানে একটি উপায়: আপনি মূলত বাছাই ফাংশনগুলির একটি তালিকা নিতে আপনার বাছাই ফাংশনটি পুনরায় লিখুন, প্রতিটি সাজানোর ফাংশনটি আপনি যে বৈশিষ্ট্যগুলি পরীক্ষা করতে চান তার সাথে তুলনা করে, প্রতিটি সাজানোর পরীক্ষায়, আপনি সন্ধান করেন এবং দেখুন যে সিএমপি ফাংশনটি শূন্য-বিপরীতে ফিরে আসে কিনা যদি তাই হয় এবং রিটার্ন মান প্রেরণ। আপনি এটিকে ল্যাম্বডাসের তালিকার একটি ফাংশনের একটি ল্যাম্বডাকে কল করে ডাকেন।
এর সুবিধাটি হ'ল এটি ডেটা দিয়ে এককভাবে পাস করে যা অন্য পদ্ধতিগুলির মতো পূর্ববর্তী বাছাইয়ের নয়। আর একটি বিষয় এটি স্থানে বাছাই করে, যেখানে সাজানো মনে হয় একটি অনুলিপি তৈরি করে।
আমি এটি একটি র্যাঙ্ক ফাংশন লিখতে ব্যবহার করেছি, এটি ক্লাসগুলির একটি তালিকার সাথে তালিকায় রয়েছে যেখানে প্রতিটি বস্তু একটি গ্রুপে রয়েছে এবং এর স্কোর ফাংশন রয়েছে, তবে আপনি কোনও বৈশিষ্ট্যের তালিকা যুক্ত করতে পারেন। আন-ল্যাম্বদা-জাতীয় নোট করুন, যদিও কোনও সেটার কল করতে ল্যাম্বডা ব্যবহারের হ্যাকিশ ব্যবহার। তালিকার অংশটি তালিকার একটি অ্যারের জন্য কাজ করবে না, তবে বাছাই করবে।
#First, here's a pure list version
my_sortLambdaLst = [lambda x,y:cmp(x[0], y[0]), lambda x,y:cmp(x[1], y[1])]
def multi_attribute_sort(x,y):
r = 0
for l in my_sortLambdaLst:
r = l(x,y)
if r!=0: return r #keep looping till you see a difference
return r
Lst = [(4, 2.0), (4, 0.01), (4, 0.9), (4, 0.999),(4, 0.2), (1, 2.0), (1, 0.01), (1, 0.9), (1, 0.999), (1, 0.2) ]
Lst.sort(lambda x,y:multi_attribute_sort(x,y)) #The Lambda of the Lambda
for rec in Lst: print str(rec)
অবজেক্টের একটি তালিকা র্যাঙ্ক করার একটি উপায় এখানে
class probe:
def __init__(self, group, score):
self.group = group
self.score = score
self.rank =-1
def set_rank(self, r):
self.rank = r
def __str__(self):
return '\t'.join([str(self.group), str(self.score), str(self.rank)])
def RankLst(inLst, group_lambda= lambda x:x.group, sortLambdaLst = [lambda x,y:cmp(x.group, y.group), lambda x,y:cmp(x.score, y.score)], SetRank_Lambda = lambda x, rank:x.set_rank(rank)):
#Inner function is the only way (I could think of) to pass the sortLambdaLst into a sort function
def multi_attribute_sort(x,y):
r = 0
for l in sortLambdaLst:
r = l(x,y)
if r!=0: return r #keep looping till you see a difference
return r
inLst.sort(lambda x,y:multi_attribute_sort(x,y))
#Now Rank your probes
rank = 0
last_group = group_lambda(inLst[0])
for i in range(len(inLst)):
rec = inLst[i]
group = group_lambda(rec)
if last_group == group:
rank+=1
else:
rank=1
last_group = group
SetRank_Lambda(inLst[i], rank) #This is pure evil!! The lambda purists are gnashing their teeth
Lst = [probe(4, 2.0), probe(4, 0.01), probe(4, 0.9), probe(4, 0.999), probe(4, 0.2), probe(1, 2.0), probe(1, 0.01), probe(1, 0.9), probe(1, 0.999), probe(1, 0.2) ]
RankLst(Lst, group_lambda= lambda x:x.group, sortLambdaLst = [lambda x,y:cmp(x.group, y.group), lambda x,y:cmp(x.score, y.score)], SetRank_Lambda = lambda x, rank:x.set_rank(rank))
print '\t'.join(['group', 'score', 'rank'])
for r in Lst: print r