<개인공부>/[Python]

[Python] 파이썬 리스트 정렬 심화 - key, reverse, lambda, 사용자 정의 정렬까지

BlockDMask 2025. 4. 25. 08:17
반응형

안녕하세요. 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

반응형