파이썬은 정렬 함수를 기본으로 제공한다.
sort()와 sorted()의 차이를 살펴보고 key 매개변수와 lambda 함수를 활용한 커스텀 정렬을 살펴본다.
1) Sort() vs Sorted()
sort()
<list>.sort([key = <function>], [reverse = True|False])
- 리스트 자료형에서만 사용 가능하다.
- 원래의 리스트가 변경된다(in-place).
- 아무것도 반환하지 않는다(None 리턴).
- 리스트를 정렬할 땐 sorted()보다 빠르다.
- reverse 매개변수로 True를 전달하면 내림차순 정렬할 수 있다.
sorted()
sorted(<iterable>, [key = <function>], [reverse = True|False])
- 모든 iterable한 객체에서 사용 가능하다.
- 원래의 리스트는 변화가 없다.
- 정렬된 새로운 리스트를 반환한다.
- sort()에 비해, 매개변수가 하나 더 추가되며 reverse 매개변수로 True를 전달하면 내림차순 정렬할 수 있다.
2) key 매개변수, lambda
key 매개변수에 비교함수로 lambda 함수를 전달함으로써 원하는 기준으로 커스텀할 수 있다.
다음과 같이 사용할 수 있다.
a = sorted(a, key=lambda x: x.modified, reverse=True)
# 나열한 원소의 인덱스를 기준으로 정렬한다.
# 이때, 나열한 순으로 우선순위가 결정된다. -> x[0], x[1]순..
a = sorted(a, key=lambda x: (x[0], x[1]))
# 원소 앞에 -를 붙여주면 내림차순 정렬이된다.
a = sorted(a, key=lambda x: (-x[0], x[1]))
이차원 리스트에서 두번째 원소를 기준으로 정렬하거나 문자열 또한 정렬 가능하다.
구체적인 예시를 살펴보자.
예제1 - 2차원 리스트
# (학생 이름[0], 중간고사 성적[1], 기말고사 성적[2])
stds = [("루니", 3.5, 4.1), ("긱스", 3.5, 3.9), ("박", 3.4, 4.5), ("테베즈", 3.9, 4.1), ("스콜스", 3.4, 3.6)]
1) 매개변수를 전달하지 않으면 0번 원소 기준으로 오름차순 정렬(default)
print(sorted(stds))
# [('긱스', 3.5, 3.9), ('루니', 3.5, 4.1), ('박', 3.4, 4.5), ('스콜스', 3.4, 3.6), ('테베즈', 3.9, 4.1)]
2) 2번 원소 기준으로 오름차순 정렬
print(sorted(stds, key = lambda x: x[2]))
# [('스콜스', 3.4, 3.6), ('루니', 3.5, 4.1), ('긱스', 3.5, 4.2), ('박', 3.5, 4.5), ('테베즈', 3.9, 4.1)]
3) 2번 원소 기준으로 오름차순 정렬하되, 만약 같다면 1번 원소 기준으로 내림차순 정렬
print(sorted(stds, key = lambda x: (x[2], -x[1])))
# [('스콜스', 3.4, 3.6), ('박', 3.5, 4.5), ('긱스', 3.5, 4.2), ('루니', 3.5, 4.1), ('테베즈', 3.9, 4.1)]
예제2 - 문자열로 이루어진 리스트
words = ["abba", "bfqe", "fqba", "gqggq", "lznm", "emxi"]
1) 오름차순 정렬
print(sorted(words))
# ['abba', 'bfqe', 'emxi', 'fqba', 'gqggq', 'lznm']
2) 내림차순 정렬
print(sorted(words, reverse = True))
# ['lznm', 'gqggq', 'fqba', 'emxi', 'bfqe', 'abba']
3) 두 번째 글자(1번 원소) 기준으로 정렬
print(sorted(words, key = lambda x: x[1]))
# ['abba', 'bfqe', 'emxi', 'fqba', 'gqggq', 'lznm']
참고
stackoverflow.com/questions/22442378/what-is-the-difference-between-sortedlist-vs-list-sort
stackoverflow.com/questions/3766633/how-to-sort-with-lambda-in-python
'프로그래밍 언어 > Python' 카테고리의 다른 글
[Python] 문자열인지 숫자인지 판별하기 (0) | 2021.06.28 |
---|---|
[Python] 순열, 조합 구현하기 - itertools & recursion (3) | 2021.02.15 |
[Python] 리스트 순회 중 변경이 필요할 때 (0) | 2021.01.04 |
[Python] 파이썬 기본 연산 시간복잡도(Big-O) (0) | 2021.01.04 |