파이썬에서 정렬은 크게 두 가지로 합니다.
- sorted(iterable, ...): 정렬된 새 리스트를 반환 (원본은 그대로)
- list.sort(...): 리스트 자체를 제자리(in-place)에서 정렬 (원본 변경, 반환값은 None)
내부 알고리즘은 둘 다 Timsort이며 **안정 정렬(stable)**입니다.
1. sorted() — 원본 보존, 새 객체 반환
f_list = ['orange', 'apple', 'mango', 'papaya', 'lemon', 'strawberry', 'coconut']
print('sorted -', sorted(f_list))
print('sorted -', sorted(f_list, reverse=True))
print('sorted -', sorted(f_list, key=len))
print('sorted -', sorted(f_list, key=lambda x: x[-1]))
print('sorted -', sorted(f_list, key=lambda x: x[-1], reverse=True))
print('원본 f_list -', f_list) # 원본은 그대로
예시 결과
sorted - ['apple', 'coconut', 'lemon', 'mango', 'orange', 'papaya', 'strawberry']
sorted - ['strawberry', 'papaya', 'orange', 'mango', 'lemon', 'coconut', 'apple']
sorted - ['apple', 'mango', 'lemon', 'orange', 'papaya', 'coconut', 'strawberry']
sorted - ['papaya', 'orange', 'apple', 'lemon', 'mango', 'coconut', 'strawberry']
sorted - ['strawberry', 'coconut', 'mango', 'lemon', 'orange', 'apple', 'papaya']
원본 f_list - ['orange', 'apple', 'mango', 'papaya', 'lemon', 'strawberry', 'coconut']
- reverse=True: 내림차순
- key=len: 길이 기준 정렬
- key=lambda x: x[-1]: 마지막 글자 기준 정렬
- key=str.lower: 대소문자 무시 정렬에 유용
2. .sort() — 제자리 정렬, 반환값 None
f_list = ['orange', 'apple', 'mango', 'papaya', 'lemon', 'strawberry', 'coconut']
print('sort -', f_list.sort(), f_list) # 알파벳 순
print('sort -', f_list.sort(reverse=True), f_list) # 내림차순
print('sort -', f_list.sort(key=len), f_list) # 길이 기준
print('sort -', f_list.sort(key=lambda x: x[-1]), f_list) # 마지막 글자
print('sort -', f_list.sort(key=lambda x: x[-1], reverse=True), f_list)
핵심 포인트
- f_list.sort()의 반환값은 항상 None → print(f_list.sort())는 None을 찍음
- 정렬된 리스트가 필요하면 정렬 후 f_list 자체를 사용
- 원본을 보존하고 싶다면 복사본에서 .sort()를 쓰거나, 처음부터 sorted() 사용
3. reverse / key 옵션 요약
- reverse=True → 내림차순
- key=<함수> → 비교 기준을 바꿔 정렬 (예: 길이, 마지막 글자, 소문자 변환 등)
- key=len, key=str.lower, key=lambda x: x[-1], key=func …
정렬은 안정적이므로, 예컨대 key=len으로 먼저 정렬하고 다시 알파벳으로 정렬해도 동일 길이 그룹의 내부 순서가 보존됩니다(혹은 반대로 다단계 정렬을 의도적으로 쌓아갈 수 있음).
4. 리스트 vs 배열(Array) — 언제 무엇을 쓸까?
- 리스트 기반
- 장점: 융통성(서로 다른 자료형도 가능), 내장 자료형과 잘 어울리는 범용적 컨테이너
- 사용처: 대부분의 일반 로직, 문자열/객체 섞인 컬렉션, 동적 크기 변경이 잦을 때
- 숫자 기반 배열 (예: array.array('i', ...) 혹은 NumPy 배열)
- 장점: 동일 자료형을 연속 메모리에 저장 → 메모리 효율/연산 성능 유리
- 사용처: 대량의 숫자 처리, 통계/선형대수/과학연산(NumPy 권장), 바이너리 I/O
간단히: 일반 로직은 리스트, 대규모 숫자 계산은 배열(특히 NumPy)
정리하면
- 새 리스트 필요 → sorted(iterable, key=..., reverse=...)
- 원본 리스트 정렬 → lst.sort(key=..., reverse=...) (반환값 None)
- 정렬 기준 → key=len, key=str.lower, key=lambda x: x[-1] 등
- 내림차순 → reverse=True
- 리스트 vs 배열 → 범용성은 리스트, 대량 숫자 성능은 배열(NumPy)
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 파이썬에서 딕셔너리를 읽기 전용으로 만들기 — MappingProxyType (0) | 2025.09.07 |
|---|---|
| 파이썬 해시테이블 개념 및 튜플 → 딕셔너리 변환하기 (0) | 2025.09.07 |
| 파이썬의 시퀀스형(Sequence) (0) | 2025.09.07 |
| 파이썬 리스트 곱하기(*)와 참조 공유 문제 (0) | 2025.09.07 |
| Python list, filter, map 쉽게 이해하기 (0) | 2025.09.07 |