2012-03-30 4 views
2

예를 들어 attrgetter과 같이 쉽게 복제 할 수없는 복잡한 기준에 따라 사전 정렬 된 개체 목록이 있습니다. 두 가지 모두 속성이있는 경우 사전 순으로 하위 집합을 정렬하고 싶습니다. part_of_subset.조건에 따른 대리인 정렬

영문자 정렬 기능을 재정의하지 않고 어떻게해야합니까?

def cmp(a, b): 
    if a.part_of_subset and b.part_of_subset: 
     # sort alphabetically -- must I duplicate alphabetic sort code? 
    return 0 

답변

4

은 정렬을위한 비교 기능을 정의하지만 일반적으로 키 기능을 사용하는 것이 좋습니다. 응용 프로그램의 경우이 키 함수는 변경되지 않은 채로 남겨 두어야 할 모든 값과 나머지 값에 대한 정렬 키를 반환해야합니다. 예

def my_key(a): 
    if a.part_of_subset: 
     return 0, 
    return 1, a.sort_key 

collection.sort(key=my_key) 

정렬 된 하위 집합은 이미 정렬 된 요소 뒤에 하나의 블록으로 그룹화됩니다.

편집가 : sort_keyNone 수 없을 수 있으며, 파이썬 3의 코드가 작동하도록하는 제한을 제거하기 위해, 나는 키 기능을 업데이트했습니다. 이전 버전에서는 정렬 키가 다른 유형 (너무 유용하지는 않지만 어쨌든) 인 경우에 이상한 결과를 가져올 수 있습니다.

+0

심지어 청소기. 매우 감사. – ash

1

return cmp(a, b)을 말하면 특정 조건에서 다른 기능으로 정렬을 위임 할 수 있습니다. 내가 내장 된 파이썬 함수 cmp, 아니 cmp 참조 해요.