이것은 오래된 질문이지만 zip
스크립트로 표시 할 수 없기 때문에 게시 된 답변 중 일부가 실제로 작동하지 않습니다 . 다른 답변은 import operator
이 모듈과 그 이점에 대한 자세한 정보를 제공 하지 않았습니다 .
이 문제에 대해 두 가지 이상의 좋은 관용구가 있습니다. 제공 한 예제 입력으로 시작하십시오.
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
이것은 90 년대에 Perl에서이 패턴을 대중화 한 R. Schwartz에 이어 Schwartzian_transform 이라고도 합니다.
# Zip (decorate), sort and unzip (undecorate).
# Converting to list to script the output and extract X
list(zip(*(sorted(zip(Y,X)))))[1]
# Results in: ('a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g')
이 경우 참고 Y
및 X
분류와 사전 식 비교된다. 즉,에서 첫 번째 항목 Y
이 비교됩니다. 동일한 경우 두 번째 항목 (from X
)이 비교됩니다. 사전 순서를 위해 원본 목록 색인을 포함시켜 중복을 원래 순서로 유지하지 않으면 불안정한 출력을 생성 할 수 있습니다 .
이를 통해 입력을 정렬하는 방법을보다 직접 제어 할 수 있으므로 정렬 할 특정 키를 지정하여 정렬 안정성 을 얻을 수 있습니다 . 더 많은 예를 보려면 여기를 참조 하십시오 .
import operator
# Sort by Y (1) and extract X [0]
list(zip(*sorted(zip(X,Y), key=operator.itemgetter(1))))[0]
# Results in: ('a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g')