2017-09-17 6 views
0

기본 Python에서 두 개 이상의 값을 기반으로 한 목록의 요소를 정렬하는 올바른 방법은 무엇입니까?두 개의 다른 목록을 기반으로 목록 정렬

X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] 
Y = [0, 1, 1, 0, 1, 2, 2, 0, 1] 
Z = [2, 1, 2, 1, 2, 1, 2, 1, 1] 

내가 X의 값 첫째 Z에 따라 다음 Y에 기반을 주문하려는 : 나는 세 가지 목록을 말해봐. 원하는 출력은 다음과 같습니다

["d", "h", "b", "i", "f", "a", "c", "e", "g"] 
+0

을 요소를 주문하는 방법은 나에게 불분명하다. –

답변

4

당신은 단순히 zip 목록 다음 sorted을 사용할 수 플러스 풀기 :

>>> [i[2] for i in sorted(zip(Z, Y, X))] 
['d', 'h', 'b', 'i', 'f', 'a', 'c', 'e', 'g'] 

핑 (ping)을 zip에 의해 처음 Z하고 원하는 줄 것이다 번째 입력으로 Y로 외 국계 이해는 ZY을 다시 삭제하고 X 값을 남깁니다. 좋아, 경우에 모두 ZY은 동일 그 것이다 비교하여 휴식 타이 X (바람직하지 않은 될 수있는 문제에 따라하는), 당신은 X 제외하는 사용자 정의 key 기능을 사용하여 해당 비활성화 수 :

>>> [i[2] for i in sorted(zip(Z, Y, X), key=lambda x: (x[0], x[1]))] 
['d', 'h', 'b', 'i', 'f', 'a', 'c', 'e', 'g'] 
+2

이것은 아마도 가장 간단합니다. 또한 람다 대신'operator.itemgetter'를 사용할 수 있습니다. – miradulo

+0

@Mitch 맞습니다.'key = operator.itemgetter (0, 1)'도 작동합니다. 나는 종종'itemgetter'가 다중 인자를 받아들이는 것을 잊는다. – MSeifert

+0

나도 그래! 또는 조각을 허용합니다. – miradulo

관련 문제