반응형
문자열이나 List를 다룰때 종종 정렬을 해야할 때가 존재한다. 파이썬에서는 sorted()
함수를 통해 정렬를 할 수 있다.
아래와 같은 리스트를 정렬해보자.
logs = ['b_1', 'a_3', 'a_1', 'b_3', 'c_2', 'c_7', 'c_1', 'a_2', 'b_2']
result = sorted(logs)
# ['a_1', 'a_2', 'a_3', 'b_1', 'b_2', 'b_3', 'c_1', 'c_2', 'c_7']
정렬은 오름차순이 기본이고, 문자와 숫자가 같이있으면 숫자가 우선순위가 더 높다.
내림차순으로 변경하고 싶다면 reverse=True
인자를 추가하면 된다.
result = sorted(logs, reverse=True)
# ['c_7', 'c_2', 'c_1', 'b_3', 'b_2', 'b_1', 'a_3', 'a_2', 'a_1']
리스트를 변수로 할당하였다면 접근제어자를 활용하여 sort()
함수를 사용할 수도 있다.
logs.sort()
다중정렬을 하고싶을때는 lambda
함수와 함께 사용하면 된다. 해당 리스트를 _
를 기준으로 알파벳은 오름차순, 숫자는 내림차순 정렬을 해보자.
logs.sort(key=lambda x: (x.split('_')[0], -int(x.split('_')[1])))
# ['a_3', 'a_2', 'a_1', 'b_3', 'b_2', 'b_1', 'c_7', 'c_2', 'c_1']
key
값에 lambda
함수를 정의한다. 이때 정렬을 2번 이상 하는경우에는 튜플 형태로 감싸면 된다. 튜플의 앞쪽부터 순차적으로 정렬을 시작하게된다. 우선 logs의 각 문자열을 _
를 기준으로 파싱한 후 앞쪽 문자열인 알파벳을 순서대로 정렬한다. 그 다음 뒤쪽 문자열인 숫자를 순서대로 정렬한다.
주의할점은 숫자도 문자열 형태로 존재하기 때문에 int로 형변환 후 정렬을 진행한다. -
기호는 내림차순 정렬를 의미한다. 만약 알파벳을 내림차순, 숫자를 오름차순 정렬을 하고 싶다면 위와같은 형태로는 진행할 수 없다. 알파벳은 문자이기 때문에 -
기호를 붙일 수가 없기 때문이다. 따라서 정렬을 두번에 나누어서 진행한다.
logs.sort(key=lambda x:x.split('_')[0], reverse=True)
logs.sort(key=lambda x:x.split('_')[1])
# ['c_1', 'b_1', 'a_1', 'c_2', 'b_2', 'a_2', 'b_3', 'a_3', 'c_7']
반응형
최근댓글