한 가지 방법은 다음과 같습니다. 기본적으로 정렬 함수 목록을 가져 오기 위해 정렬 함수를 다시 작성합니다. 각 정렬 함수는 테스트하려는 속성을 비교하고 각 정렬 테스트에서 cmp 함수가 0이 아닌 리턴을 리턴하는지 확인합니다. 그렇다면 중단하고 반환 값을 보내십시오. Lambda 목록의 함수 중 Lambda를 호출하여 호출합니다.
다른 방법과 달리 이전 정렬과는 달리 데이터를 단일 패스로 전달한다는 이점이 있습니다. 또 다른 것은 그것이 제자리에 정렬되는 반면에, 분류는 사본을 만드는 것 같습니다.
각 함수가 그룹에 있고 점수 함수가있는 클래스 목록의 순위를 매기는 순위 함수를 작성하는 데 사용했지만 속성 목록을 추가 할 수 있습니다. 람다를 해커가 사용하여 세터를 호출하지만, 람다와 같은 점에 유의하십시오. 순위 부분은 일련의 목록에서 작동하지 않지만 정렬됩니다.
#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