특정, 다중 조건으로 리스트 정렬하기
Python에서 리스트를 정렬하기 위해 sort()와 sorted() 메서드를 사용한다. 두 메서드의 간단한 활용으로 숫자의 크기 혹은 문자 순서대로 오름차순/내림차순으로 정렬이 쉽게 가능하다. 그러나 정렬의 기준을 직접 설정하거나 여러 개의 조건으로 정렬해야 할 경우도 있다. 이때 메서드의 파라미터인 "key"를 사용하면, 조건을 직접 설정하여 리스트 정렬이 가능하다.
특정 조건으로 리스트 정렬하기
1차원 리스트일 경우 간단히 정렬이 가능하지만, 2차원 이상의 리스트는 단순히 sort(), sorted()를 사용하면 원하지 않는 결과가 나올 수 있다. 이 경우 key를 지정하면 원하는 조건을 설정해 리스트를 정렬할 수 있다. 아래의 리스트를 예시로 정렬해 보자.
a = [(1, 'a'), (0, 'b'), (5, 'e'), (5, 'd'), (3, 'c')]
key 사용 및 숫자를 기준으로 정렬
정렬을 진행하기 전에 sort(), sorted() 메서드의 파라미터인 key에 대해 알아보자. key는 정렬의 기준을 설정하는 파라미터로 lambda 함수와 같이 쓰인다. 아래의 코드에서 key에 작성된 x는 리스트의 각 요소라고 생각하면 된다. 따라서 x[0]으로 지정하면, 각 요소의 첫 번째 값이 정렬의 기준이 된다. 결과를 확인해 보면 숫자를 기준으로 오름차순 정렬된 것을 확인할 수 있다.
- x = (1, 'a'), (0, 'b'), (5, 'e'), (5, 'd'), (3, 'c')
- x[0] = 1, 0, 5, 5, 3
a = [(1, 'a'), (0, 'b'), (5, 'e'), (5, 'd'), (3, 'c')]
test_1 = sorted(a, key=lambda x: x[0])
print(test_1)
# [(0, 'b'), (1, 'a'), (3, 'c'), (5, 'e'), (5, 'd')]
문자를 기준으로 정렬
다음으로 key의 lambda 함수에서 x[0]이 아닌 x[1]로 지정하면, 문자를 기준으로 정렬된다. 추가로 reverse 인자를 넣어도 정상적으로 작동한다.
- x = (1, 'a'), (0, 'b'), (5, 'e'), (5, 'd'), (3, 'c')
- x[1] = 'a', 'b', 'e', 'd', 'c'
a = [(1, 'a'), (0, 'b'), (5, 'e'), (5, 'd'), (3, 'c')]
test_1 = sorted(a, key=lambda x: x[1], reverse=True)
print(test_1)
# [(5, 'e'), (5, 'd'), (3, 'c'), (0, 'b'), (1, 'a')]
다중 조건으로 리스트 정렬하기
다중 조건도 lambda 함수를 사용해 작성하며, 콜론(:) 다음 부분의 조건들을 괄호로 묶어주면 된다. 아래의 리스트를 예시로 정렬해 보자.
a = [(1, 'a'), (0, 'b'), (5, 'e'), (5, 'd'), (3, 'c')]
숫자, 문자를 기준으로 정렬
key의 lambda 함수에 (x[0], x[1])을 작성함으로써 숫자로 정렬한 뒤 문자 순서대로 정렬을 진행한다. 즉, 같은 숫자일 경우에 문자를 비교하여 정렬하는 것이다. 아래의 경우 5가 두 개 존재하므로 문자의 정렬까지 이루어져 'd', 'e' 순서로 변경된 것을 확인할 수 있다.
a = [(1, 'a'), (0, 'b'), (5, 'e'), (5, 'd'), (3, 'c')]
test_1 = sorted(a, key=lambda x: (x[0], x[1]))
print(test_1)
# [(0, 'b'), (1, 'a'), (3, 'c'), (5, 'd'), (5, 'e')]
추가 예시
아래의 코드는 세 개의 조건을 기준으로 정렬한 것이다.
- 참고
- 숫자형 변수에 '-'를 붙여 작성하면 역순으로 정렬
- 이를 활용해 기준에 따라 오름차순, 내림차순을 자유롭게 설정 가능
words = dict(sorted(words.items(), key=lambda item:(-item[1], -len(item[0]), item[0])))
Reference
'Python' 카테고리의 다른 글
[Python] 셰이프 파일(shp) 데이터의 위도, 경도 및 주소 추출하기 (1) | 2024.09.27 |
---|---|
[Python] 한 줄에 여러 개 입력받기(map, split) (2) | 2024.05.17 |
[Python] 데크(Deque) 개념과 활용 (0) | 2024.05.15 |
[Python] enumerate() 함수 개념과 활용 (0) | 2024.03.30 |
[Python] 람다(Lambda) 함수 개념과 활용 (0) | 2024.03.28 |