오늘 코딩 테스트를 풀며 파이썬의 람다 함수에 대해 쓰다가, 확실히 알고 넘어가는 게 좋을 것 같아 정리하고 넘어가기로 했다!
내가 주로 사용했던 람다 함수는 특정 기준으로 정렬할 때 사용했다. 예를 들어, {'a': 10, 'b': 20, 'c': 30}이라는 딕셔너리가 있다고 해 보자. 이 딕셔너리에서 key나 value를 기준으로 정렬하고 싶을 때 말이다.
어떠한 특정 기준으로 정렬하려면 파이썬의 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번째 문자가 같을 때는 전체 문자열을 사전순으로 정렬해주는 역할을 한다.
'알고리즘' 카테고리의 다른 글
[자료구조] 최소힙 / 최대힙 (0) | 2024.10.17 |
---|---|
[Algorithm] 최단 경로 - 실전 문제풀이(3) (2) | 2024.07.25 |
[Algorithm] 최단 경로 - 플로이드 워셜 알고리즘(2) (4) | 2024.07.25 |
[Algorithm] 최단 경로 - 다익스트라 최단 경로 알고리즘(1) (11) | 2024.07.24 |
[Algorithm]동적 프로그래밍(Dynamic Programming) (0) | 2024.07.17 |