[python] sorted(), sort(), key 사용법

vinca·2023년 9월 15일
3

Introduction

정렬과 관련한 문제를 해결하다가 sort에 대한 key의 기준에 대해서 정리하게 되었다.

sorted와 sort는 근본적으로 매우 유사하다.
하지만 사용방법에서의 약간의 차이가 있다.
바로 알아보도록 하자.

sorted

기본적으로 정렬을 하는 함수이다.
정렬 기준은 기본적으로 오름차순(사전순)을 기준으로 정렬되게 된다.

my_list = ['d', 'e', 'a', 'c', 'b']
sorted_list = sorted(my_list)
print(sorted_list)

결과

['a', 'b', 'c', 'd', 'e']

sort

이 또한 동일하게 정렬하는 함수이다.
하지만 차이점은 sorted의 경우 반환값으로 정렬된 새로운 리스트가 나오지만, sort의 경우 반환값이 없이 해당 리스트 자체를 다시 정렬 시킨다.

my_list = ['d', 'e', 'a', 'c', 'b']
# 리스트 자체를 정렬
my_list.sort()
print(my_list)

결과

['a', 'b', 'c', 'd', 'e']

sorted시, Key 값에 따른 정렬

자 이제 key를 이용해서 정렬에 대한 기준점을 새롭게 정의해보자.
예제를 보며 바로 key의 사용법을 알아보자.

1. 절댓값, 내림차순

기존 sorted는 오름차순 정렬이였다. 이를 내림차순으로 변경해보고 하나 더 해서 절댓값을 기준으로 해보자.

key = abs ➡️ 절댓값을 기준으로 정렬하겠다.
reverse = True ➡️ 기존 오름차순 정렬을 reverse 하겠다. (즉, 내림차순됨)

my_list = [-5, 3, -1, 0, 2, -4]
sorted_list = sorted(my_list, key=abs, reverse=True)

결과

[-5, -4, 3, 2, -1, 0]

2. 문자열을 길이를 기준으로 정렬

각 문자열의 길이를 기준으로 짧은 순서대로 정렬하려면 어떻게할까?
key의 기준을 문자열의 길이 즉, key = len을 넣어주면된다.

my_list = ["api", "app", "carrier", "demon", "aaa"]
sorted_list = sorted(my_list, key=len)
print(sorted_list)

결과

['api', 'app', 'aaa', 'demon', 'carrier']

길이를 기준으로 잘 정렬됐으나, 뭔가 보기 불편하다.
바로 사전순(오름차순)으로 정렬이 안되었기 때문이다.

그럼 sorted가 사전순이니까 sorted_list를 한번더 sorted(sorted_list)하면 되는 거 아닌가요?

과연 그럴까? 결과를 살펴보자.

my_list = ["api", "app", "carrier", "demon", "aaa"]
sorted_list = sorted(my_list, key=len)
# 오름차순을 만들기 위해서 한번 더 sorted 실행
sorted_again_list = sorted(sorted_list)
print(sorted_again_list)

결과

['aaa', 'api', 'app', 'carrier', 'demon']

어? 기존 길이순(len)으로 정렬해 놓았던 것이다 깨져버렸다
이 문제를 어떻게 해결해야할까?

3. 길이를 기준으로 정렬하고, 오름차순(사전순)으로 정렬

해결방법은 key값을 조금 더 고급스럽게 지정하는 것이다.
바로 정답을 보자.

my_list = ["api", "app", "carrier", "demon", "aaa"]
sorted_list = sorted(my_list, key= lambda x : (len(x), x))
print(sorted_list)

결과

['aaa', 'api', 'app', 'demon', 'carrier']

lamda에 대해서 어렵게 생각할 것 없다.

lamda란?

쉽게말해 함수를 짧게 만든 것이다.

lambda a : b

a: 입력 인자(매개변수)
b: 입력 인자를 사용하여 계산할 값. 즉, 계산하고 반환되는 값.

How to use?

다시 돌아와 우리의 코드에서 보자.

sorted_list = sorted(my_list, key= lambda x : (len(x), x))

먼저 우리의 코드에서는 lambda 함수 내 2개의 계산할 값이 있다.

len(x), x

이 둘은 다음과 같이 괄호(튜플) 형태로 감싸져 있는 것을 확인할 수 있다.

(len(x), x)

첫 번째인 len(x)부터 어떻게 동작하는지 알아보자.

입력인자 x는 my_list내의 문자열 하나가 된다.
어차피 하나하나 전부 비교될 것이니, x = aaa라고 가정하자.

이를 len(x)에 넣게되면 3이라는 값이 나온다.

반환된 3이라는 값은 리스트를 정렬하는데 이용되고, 나머지 api, dempn, carrier 등 또한 3, 4, 5등의 값이 계산되며 길이순으로 정렬하게 될 것이다.

자, 그럼 (len(x), x)에서 len(x)는 알아 보았는데, 뒤에 x는 무엇일까?

x는 아무런 함수 식이나 적용도 하지 않은 문자열 그 자체이므로 오름차순(사전순) 정렬을 의미한다.

🎯핵심 정리

즉, 첫번째로 나온 len(x)를 통해 길이 순서로 정렬하되,
만약에 같은 길이가 나온다면, 두번째 비교 방법인 x를 통해서 오름차순(사전순)정렬하라는 뜻이다.

따라서 결과는 다음과 같이 길이 기준으로 정렬하되, 같은 길이의 경우에는 오름차순으로 정렬하는 결과가 나온다.

['aaa', 'api', 'app', 'demon', 'carrier']

🧐그래서 lamda를 왜 썼는데?

쉽게 생각하여, key에는 한개의 비교조건만 적용 가능한데, 두개의 조건을 한번에 비교해야하는 상황이니 lamda 함수를 통해서 이를 마치 하나의 비교조건인 것처럼 묶어서 사용한 것이다.

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글