Python) 2개 이상 기준으로 정렬하기

Wonjun Lee·2024년 4월 12일

온라인 저지 사이트에 푼 문제 중에서 다음과 같은 입력이 들어왔다.

2
J-123 I-808 B-203 A-102 A-4
C-19 G-999 G-555 G-902 I-111

이 문제를 풀 당시 정렬의 필요성이 있다고 생각했고, 우선 주어진 문자열을 정렬하고자 하였다.

일단 입력된 순서를 유지해야 했으므로 sorted 함수를 사용했다.

아무런 수단을 사용하지 않고 단순히 sorted만 호출할 경우에는 A-102가 A-4 앞에 오게된다. 이것은 파이썬에서 정렬을 수행할 때 문자열의 경우 앞에서부터 한 글자씩 비교하며 A-4의 4와 A-102의 1을 비교하기 때문으로 번호를 고려할 수 있도록 적절히 수정해야한다. 보통 int() 함수를 사용하면 편하다.

sorted 함수의 인자를 살펴보면 자주 사용되는 key와 reverse가 있다.

흔히 key를 통해 정렬기준이 되는 값을 추출할 함수를 전달했는데 2개 이상 기준을 사용하는 경우 어떻게 해야할 지 잘 몰랐다.

예를 들면 튜플들을 정렬할 때 첫번째 요소의 값이 같으면 두 번째 요소 기준으로 내림차순 정렬하는 등의 방법이 필요했다.


결론부터 말하면 key에 전달되는 함수가 튜플을 반환하도록 하면 된다.

sorted(my_list, key= lambda x : (x[0] , int(x[2:])))

이렇게 하면 정렬될 때 첫 번째 요소가 같으면 두 번째 요소로 비교를 하게 된다.

다만 위와같이 하면 오름차순 정렬되므로 내림차순 하고 싶다면 -int(x[2:]) 로 수정하여 음수로 만들어준다.

또한 두 번째 요소가 알파벳 같은 문자이고 int() 적용이 안되는데 내림차순 하고 싶다면 ord() (= 문자의 유니코드를 반환한다.)를 이용해서 다음과 같이 적는다.

sorted(my_list, key= lambda x : (x\[0] , -ord(x[2])))

하지만 아직 두 번째 요소로 하나의 글자가 아닌 여러 문자열을 사용해서 내림차순 하는 방법은 잘 모르겠다. 고민해보고 찾아본 후 답이 나오면 추가하도록 하겠다.

0개의 댓글