오늘 코딩 테스트를 풀며 파이썬의 람다 함수에 대해 쓰다가, 확실히 알고 넘어가는 게 좋을 것 같아 정리하고 넘어가기로 했다!

 

내가 주로 사용했던 람다 함수는 특정 기준으로 정렬할 때 사용했다. 예를 들어, {'a': 10, 'b': 20, 'c': 30}이라는 딕셔너리가 있다고 해 보자. 이 딕셔너리에서 keyvalue를 기준으로 정렬하고 싶을 때 말이다.

 

어떠한 특정 기준으로 정렬하려면 파이썬의 sorted() 함수를 사용하면 된다.

 

sorted()는 원본 데이터를 정렬하지 않고, 정렬된 새로운 결과값을 반환하므로 이를 다른 변수에 할당해야 한다.

 

목표: 딕셔너리의 value를 기준으로 정렬한 후, 다시 딕셔너리 형태로 반환하기

 

temp = {'a': 30, 'b': 60, 'c': 10}

sorted_dict = dict(sorted(temp.items(), key=lambda x: x[1]))

결과: {'c': 10, 'a': 30, 'b': 60}

 

여기서 주의할 점은 딕셔너리를 sorted() 함수로 정렬할 때, 기본적으로는 key 값이 기준이 된다는 것이다. 그래서 value를 기준으로 정렬하려면 먼저 temp.items()(key, value) 쌍에 접근해야 한다.

 

또 하나의 예시: 문자열을 특정 문자를 기준으로 정렬하기

 

문제를 풀다가 sorted() 함수의 또 다른 유용한 기능을 발견했다. 예를 들어, 여러 개의 문자열을 담고 있는 배열이 있고, 이 배열을 특정 인덱스의 문자를 기준으로 정렬한다고 해 보자.

temp = ["abce", "abcd", "cdx"]

 

이 문자열들에서 3번째 인덱스의 문자를 기준으로 정렬하려면, 각 단어의 3번째 문자는 'c', 'c', 'x'가 된다. 이를 기준으로 정렬하면 다음과 같다.

sorted_arr = list(sorted(temp, key=lambda x: x[3]))

 

결과는 ['abce', 'abcd', 'cdx']가 된다. 그런데 만약 같은 문자를 가진 경우, 이를 전체 문자열을 기준으로 정렬하고 싶다면 어떻게 할까?

 

즉, 같은 3번째 문자를 가진 ['abce', 'abcd']가 있을 때, 전체 문자열을 기준으로 ['abcd', 'abce', 'cdx']로 정렬하고 싶은 경우다.

 

이때는 이렇게 해결할 수 있다:

sorted_arr = list(sorted(temp, key=lambda x: (x[3], x)))

이 코드는 3번째 문자를 기준으로 정렬하되, 3번째 문자가 같은 경우 전체 문자열 x를 기준으로 정렬한다. 이렇게 하면 최종 결과는 ['abcd', 'abce', 'cdx']가 된다.

 

이 코드는 문자열 배열 temp두 가지 기준으로 정렬하는데, 두 번째 기준이 첫 번째 기준과 같을 때만 적용된다. 

 

코드 설명:

1. sorted() 함수: sorted()는 배열을 정렬하는 함수로, 정렬된 새로운 리스트를 반환한다. 여기서는 temp 리스트를 정렬하고 있다.

2. key=lambda x: (x[3], x):

key는 정렬할 때 기준이 되는 값을 지정하는 인자다. 여기서는 람다 함수를 사용해서 정렬 기준을 두 가지로 나눈다.

첫 번째 기준: x[3]으로, 각 문자열의 3번째 인덱스의 문자를 기준으로 정렬한다.

두 번째 기준: x로, 전체 문자열을 기준으로 정렬한다. 이 두 번째 기준은 첫 번째 기준(3번째 문자)이 동일할 때만 적용된다.

 

작동 원리:

 

파이썬의 sorted() 함수는 튜플로 정렬할 때, 첫 번째 요소를 먼저 비교하고, 첫 번째 요소가 같으면 두 번째 요소를 비교한다.

lambda x: (x[3], x)두 가지 기준을 갖는 튜플 (x[3], x)를 반환한다:

첫 번째 기준: x[3]은 각 문자열의 3번째 문자다. 이를 기준으로 정렬한다.

두 번째 기준: x전체 문자열이다. 만약 3번째 문자가 같다면, 문자열 전체를 기준으로 사전순 정렬한다.

 

예시로 살펴보기:

 

temp = ["abce", "abcd", "cdx"]

 

1. 첫 번째 기준: 각 문자열의 3번째 문자는 다음과 같다:

'abce': 3번째 문자 'c'

'abcd': 3번째 문자 'c'

'cdx': 3번째 문자 'x'

2. 첫 번째 기준으로 정렬:

'abce''abcd'는 3번째 문자가 같으므로 같은 그룹으로 묶인다.

'cdx'는 3번째 문자가 'x'라서 나중에 온다.

3. 두 번째 기준: 3번째 문자가 같은 **‘abce’**와 **‘abcd’**의 경우, 이제 전체 문자열을 기준으로 사전순으로 정렬된다:

'abcd''abce'보다 사전순으로 앞서므로 먼저 위치하게 된다.

 

최종 결과:

 

결과적으로, 정렬된 리스트는 ['abcd', 'abce', 'cdx']가 된다.

 

요약:

 

sorted(temp, key=lambda x: (x[3], x))첫 번째로 3번째 문자를 기준으로, 두 번째로 전체 문자열을 기준으로 정렬하는 방식이다.

만약 3번째 문자가 같을 때전체 문자열을 사전순으로 정렬해주는 역할을 한다.

+ Recent posts