2009-10-04 4 views
15

여러 속성으로 파이썬 목록을 정렬해야합니다. ALL은Python : 여러 속성 및 혼합 순서로 목록 정렬

L.sort(key=operator.attrgetter(attribute)).... 

쉽게 속성하지만 문제는 내가이/I가 상승에 대한 혼합 된 구성을 사용 가지고, 오름차순 내림차순 그렇게 할 수 ... 난으로 조금 SQL 주문 "모방"해야 당신은 "ASC, year DESC"와 같은 것을 할 수 있습니다. 사용자 정의 비교 함수를 구현하지 않고도 Python에서 쉽게이 작업을 수행 할 수 있습니까?

+3

@ecatmur이 질문은 다른 질문보다 오래되었습니다. 복제본은 그 반대의 경우입니다. – Jesse

답변

26

당신의 속성이 숫자 인 경우,이 있습니다.

def mixed_order(a): 
    return (a.attribute1, -a.attribute2) 

someList.sort(key=mixed_order) 

속성에 문자열이나 기타 복잡한 개체가 포함되어있는 경우 몇 가지 선택 사항이 있습니다.

.sort() 방법은 안정 적입니다. 여러 번 통과 할 수 있습니다. 이것은 아마도 가장 간단합니다. 놀랍게도 빠릅니다.

def key1(a): return a.attribute1 
def key2(a): return a.attribute2 

someList.sort(key=key2, reverse=True) 
someList.sort(key=key1) 

유일한 정렬 인 경우 고유 한 특수 비교 연산자를 정의 할 수 있습니다. 최소한 __eq____lt__이 필요합니다. 다른 4 개는 간단한 논리에 의해이 두 개에서 파생 될 수 있습니다.

+0

감사합니다! callint sort() 여러 번 나에게 완벽한 솔루션으로 밝혀졌습니다! –

+0

답변 해 주셔서 감사합니다. 첫번째 부분에 관한 약간의 혼란. 튜플을 반환 할 때 우선 순위가 더 높은 인덱스 값이 더 높은 복잡한 정렬을 수행합니까? 내 질문에 더 일반적으로, 어떻게'cmp' 두 튜플을 건 드리면 동작하는 것 같아요? 나는 주변을 둘러 보았고 이것을 발견 할 수 없었다. –

+0

__eq__는 간단한 논리를 사용하여 __lt__에서 파생 될 수 있습니다. :) – Tony

5

당신은 할 수 있지만, 비교 함수를 작성하는 것은 간단하다

def my_cmp(a, b): 
    return cmp(a.foo, b.foo) or cmp(b.bar, a.bar) 
L.sort(my_cmp) 
7

사용자 정의 기능은 당신의 코드를 읽기 렌더링됩니다. 당신이 많은 정렬 작업을하고 있지만 그 함수를 생성하지 않으려면, 당신은 람다의를 사용할 수 있습니다

L.sort(lambda x, y: cmp(x.name, y.name) or -cmp(x.year, y.year))