[Python] 파이썬 리스트 정렬 심화 - key, reverse, lambda, 사용자 정의 정렬까지
안녕하세요. BlockDMask 입니다.
오늘은 파이썬 리스트 정렬의 다양한 방법을 소개하겠습니다.
sort, sorted 기본 사용법부터 key, reverse 옵션, lambda 응용, 그리고 사용자 정의 함수까지 예제와 함께 알아봅니다.
1. 기본 정렬 - sort()와 sorted()
numbers = [4, 2, 7, 1]
numbers.sort()
print(numbers) # [1, 2, 4, 7]
numbers = [4, 2, 7, 1]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # [1, 2, 4, 7]
print(numbers) # [4, 2, 7, 1]
설명:
- sort()
는 리스트 자체를 오름차순으로 정렬(값이 바뀜)합니다.
- sorted()
는 원본은 두고, 정렬된 새로운 리스트를 반환합니다.
- 데이터 원본을 보존할지, 직접 변경할지에 따라 선택하면 됩니다.
2. 오름차순 vs 내림차순 정렬 (reverse 옵션)
nums = [3, 1, 4, 2]
nums.sort(reverse=True)
print(nums) # [4, 3, 2, 1]
설명:
- reverse=True
옵션을 쓰면 큰 수부터 작은 수로 내림차순 정렬됩니다.
- 반대로 reverse=False
는 기본(오름차순) 정렬입니다.
- 데이터가 큰 값 → 작은 값 순으로 필요할 때 활용합니다.
3. key 옵션 - 기준을 지정해 정렬하기
words = ["BlockDMask", "Python", "AI", "code"]
words.sort(key=len)
print(words) # ['AI', 'code', 'Python', 'BlockDMask']
설명:
- key=len
옵션을 쓰면, 각 요소의 길이를 기준으로 짧은 순서대로 정렬합니다.
- 다양한 기준(길이, 알파벳, 숫자 등)으로 정렬해야 할 때 key
옵션을 자주 씁니다.
- 문자열 길이, 또는 리스트 안에 튜플이나 딕셔너리가 있을 때 기준값 설정에 필수입니다.
4. lambda를 활용한 복잡한 정렬
words = ["block", "Code", "mask", "AI"]
words.sort(key=lambda x: x.lower())
print(words) # ['AI', 'block', 'Code', 'mask']
설명:
- lambda x: x.lower()
는 각 단어를 소문자로 변환한 결과를 기준으로 정렬합니다.
- 이 방식은 대소문자 구분 없이 알파벳 순서로 정렬하고 싶을 때 매우 유용합니다.
- 복잡한 기준이 필요할 때 lambda
함수와 key
를 조합해 사용합니다.
5. 딕셔너리 리스트 정렬 (key와 lambda 조합)
users = [
{"name": "BlockDMask", "age": 29},
{"name": "Alice", "age": 23},
{"name": "Bob", "age": 25}
]
users.sort(key=lambda user: user["age"])
print(users)
# [{'name': 'Alice', 'age': 23}, {'name': 'Bob', 'age': 25}, {'name': 'BlockDMask', 'age': 29}]
설명:
- lambda user: user["age"]
로 각 딕셔너리의 "age" 값을 기준으로 오름차순 정렬합니다.
- 리스트 안에 여러 사람(딕셔너리)이 있을 때, 특정 필드 기준(예: 나이, 점수)으로 순서를 정해야 할 때 자주 활용됩니다.
6. 여러 기준으로 정렬하기 (튜플, lambda)
students = [
("BlockDMask", 90),
("Alice", 95),
("Bob", 90)
]
students.sort(key=lambda x: (x[1], x[0]))
print(students)
# [('BlockDMask', 90), ('Bob', 90), ('Alice', 95)]
설명:
- lambda x: (x[1], x[0])
는 점수(두 번째 항목)로 정렬, 점수가 같으면 이름(첫 번째 항목) 순으로 정렬합니다.
- 여러 기준을 동시에 적용해야 할 때, key에 튜플을 넘겨주면 순서대로 적용됩니다.
7. 사용자 정의 함수로 정렬 기준 만들기
def custom_key(x):
return x % 10
nums = [23, 45, 12, 39]
sorted_nums = sorted(nums, key=custom_key)
print(sorted_nums) # [12, 23, 45, 39]
설명:
- custom_key(x)
는 각 숫자의 일의 자리 값(10으로 나눈 나머지)을 기준으로 정렬합니다.
- 직접 기준 함수를 만들어야 할 때, key
에 함수명을 넣어서 정렬할 수 있습니다.
8. 역순 정렬 (내림차순 key 응용)
nums = [1, 5, 2, 7]
nums.sort(key=lambda x: -x)
print(nums) # [7, 5, 2, 1]
설명:
- key=lambda x: -x
는 각 값에 음수를 곱해서 큰 값이 먼저 오게 만듭니다.
- reverse 옵션을 쓰지 않고도 내림차순 정렬 효과를 낼 수 있습니다.
9. 문자열 정렬: 알파벳, 길이, 대소문자 구분
words = ["apple", "Banana", "cherry", "banana"]
words.sort()
print(words) # ['Banana', 'apple', 'banana', 'cherry']
words.sort(key=str.lower)
print(words) # ['apple', 'Banana', 'banana', 'cherry']
words.sort(key=len)
print(words) # ['apple', 'Banana', 'cherry', 'banana']
설명:
- sort()
는 기본적으로 알파벳(유니코드) 순, 대문자가 소문자보다 앞에 옵니다.
- key=str.lower
는 대소문자 구분 없이 정렬, key=len
은 길이순 정렬입니다.
- 데이터의 성격에 따라 다양한 기준을 조합할 수 있습니다.
10. 리스트 정렬 시 주의사항
sort()
는 리스트를 바로 변경하고,sorted()
는 새 리스트 반환key
,reverse
는 동시에 사용할 수 있음- 정렬 기준 함수는 값 하나를 받아 정렬에 사용할 값을 리턴
결론
- 간단한 정렬: sort(), sorted()
- 내림차순: reverse=True, key=lambda x: -x
- 여러 기준: key=lambda x: (기준1, 기준2...)
- 딕셔너리, 사용자 정의: key, lambda 조합
- 정렬 활용법을 익히면 데이터 처리 속도가 훨씬 빨라짐
이상, 파이썬 리스트 정렬 심화에 대해 정리해보았습니다.
오늘도 읽어주셔서 감사합니다.
함께 읽으면 좋을 포스트: https://blockdmask.tistory.com/564