2012-08-27 4 views
0

각 행은 고유 한 여러 열의 데이터 테이블이 있으며 여러 열을 기준으로 정렬하는 방법을 알고 싶습니다. 사전 순으로 정렬하는 경우 솔루션은 이미 here으로 설명되어 있습니다. 그러나 알파벳순 정렬 대신 다른 목록에 저장된 사용자 지정 순서에 따라 각 열을 정렬해야합니다. 예를 들어, 내 표각 열에 대한 사용자 지정 순서가있는 다중 열 테이블 정렬

mytable = [ 
    ('A1', 'B1', 'C1'), 
    ('A1', 'B2', 'C2'), 
    ('A2', 'B2', 'C1'), 
    ('A2', 'B2', 'C2') 
] 

제가 첫번째 컬럼 [ "A2", "A1", 두 번째 열이 정렬되도록 [ "B1", "B2를 '] 주문 할 수 있으며, 만약 순서가 정해지는 3 번째의 열 [ 'C2', 'C1'] 올바른 결과는

mytable = [ 
    ('A2', 'B2', 'C2'), 
    ('A2', 'B2', 'C1'), 
    ('A1', 'B1', 'C1'), 
    ('A1', 'B2', 'C2') 
] 

답변

1

을 할 것입니다 에 대한 :

orderings = (
    ('A2', 'A1'), 
    ('B1', 'B2'), 
    ('C2', 'C1') 
) 

orders = [dict([(v, i) for i, v in enumerate(o)]) for o in orderings] 

mytable.sort(key=lambda r: tuple(o[c] for c, o in zip(r, orders))) 

실제적으로 열은 모두 정렬되지 않을 수도 있고, 좌우 정렬 이외의 우선 순위로 정렬 될 수도 있습니다. 이는 각각에 색인을 붙이고 그에 따라 알고리즘을 적용함으로써 해결할 수 있습니다.

1

기본적으로 사전 순으로 정렬됩니다. 다시 말하면 튜플을 반환하는 키 함수를 작성하는 것입니다. 예제 코드 :

order_a = {"A1": 1, "A2": 0} 
order_b = {"B1": 0, "B2": 1} 
order_c = {"C1": 1, "C2": 0} 

def key(t): 
    return order_a[t[0]], order_b[t[1]], order_c[t[2]] 

mytable.sort(key=key) 

(이 가능한 값의 큰 집합에 대한 더 나은 성능을 초래할 것이기 때문에 내가 여기 순서를 정의하는 대신 목록의 사전을 사용했다.) 이것은 당신이 무엇을 찾고 있는지

+0

3 개 이상의 열이있는 테이블의 경우 확장해야합니다. –

+0

@DavidRobinson : 실제 문제에 초점을 맞추기로했습니다. 물론 이것을 3에서 n으로 일반화하기 위해 루프 또는 이와 비슷한 것이 필요하지만 이것은 문제가 아닙니다. –

+1

"A1", "A2"등의 예제를 보면 이것이 실제 사용 사례가 아님을 알 수 있습니다. –

관련 문제