파이썬/기초 프로그래밍

파이썬 sorted() vs 리스트 .sort() 제대로 정리하기

Data Jun 2025. 9. 7. 14:32

파이썬에서 정렬은 크게 두 가지로 합니다.

  • 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)