यहां एक तरीका है: आप मूल प्रकार के कार्यों की सूची लेने के लिए मूल रूप से अपने सॉर्ट फ़ंक्शन को फिर से लिखते हैं, प्रत्येक सॉर्ट फ़ंक्शन उन विशेषताओं की तुलना करता है जिन्हें आप परीक्षण करना चाहते हैं, प्रत्येक प्रकार के परीक्षण पर, आप देखते हैं और देखते हैं कि क्या सीएमपी फ़ंक्शन एक गैर-शून्य रिटर्न देता है यदि ऐसा है तो रिटर्न वैल्यू को तोड़ें और भेजें। आप इसे लैंबडास की सूची के एक समारोह का लैंबडा कहकर पुकारते हैं।
इसका लाभ यह है कि यह डेटा के माध्यम से एकल पास करता है न कि पिछले प्रकार की तरह जैसा अन्य तरीके करते हैं। एक और बात यह है कि यह जगह में सॉर्ट करता है, जबकि सॉर्ट करने पर लगता है कि यह एक कॉपी है।
मैंने इसे एक रैंक फ़ंक्शन लिखने के लिए उपयोग किया, जो उन कक्षाओं की एक सूची को रैंक करता है जहां प्रत्येक ऑब्जेक्ट एक समूह में होता है और एक स्कोर फ़ंक्शन होता है, लेकिन आप विशेषताओं की किसी भी सूची को जोड़ सकते हैं। संयुक्त राष्ट्र के लैम्ब्डा की तरह ध्यान दें, हालांकि एक सेटर को कॉल करने के लिए लैम्बडा के हैकिश उपयोग। रैंक भाग सूचियों की एक सरणी के लिए काम नहीं करेगा, लेकिन क्रमबद्ध होगा।
#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