프로그래밍백엔드 개발자

파이썬의 리스트에서 sort() 메서드는 어떻게 작동하며, sorted() 함수와의 차이점은 무엇인가요? 중요한 매개변수, 사용 시의 주의사항과 잠재적인 함정은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

문제의 역사: sort() 메서드는 파이썬의 리스트 타입에 처음부터 내장되어 있으며, sorted() 함수는 파이썬 2.4에서 등장했습니다. 컬렉션 정렬은 프로그래밍에서 가장 흔한 작업 중 하나이며, 파이썬은 이를 해결하기 위한 두 가지 주요 도구를 제공합니다.

문제: 많은 초보자들이 sort() (리스트 메서드)와 sorted() (고급 함수)를 혼동합니다. 제자리 정렬을 사용할 때와 어떤 객체를 정렬할 수 있는지, key/reverse를 통해 임의의 순서를 설정하는 방법, 특히 복잡한 사용자 정의 구조에서 어떤 함정이 있는지에 대한 이해가 부족합니다.

해결책:

  • list.sort()는 원래 리스트를 제자리에서 정렬하며 None을 반환합니다. 원래 객체를 변경합니다.
  • sorted()는 원본을 변경하지 않고 새로운 정렬된 리스트(또는 다른 타입, 필요에 따라) 를 반환합니다. 모든 반복 가능한 객체(생성자 포함)에서 작동합니다.
  • 두 메서드는 key (정렬 함수)와 reverse (역순 정렬을 위한 불리언 플래그) 매개변수를 지원합니다.

코드 예시:

numbers = [5, 2, 9, 1] numbers.sort() # numbers = [1, 2, 5, 9] words = ['aaa', 'ZZZ', 'bbb'] sorted_words = sorted(words, key=str.lower, reverse=True) # sorted_words = ['ZZZ', 'bbb', 'aaa'] # words는 변경되지 않음

주요 특징:

  • sort()는 리스트에서만 작동하며 제자리 정렬을 하고, sorted()는 더 일반적이며 모든 반복 가능한 객체에서 작동합니다.
  • key 매개변수를 통해 정렬 방식을 사용자 정의할 수 있습니다 — 람다 또는 객체 속성에 따라 정렬하기 편리합니다.
  • sort가 None을 반환한다는 점을 혼동하지 않는 것이 중요합니다. 이는 종종 랜덤한 할당에서 오류를 초래합니다.

교묘한 질문.

내가 my_list = my_list.sort()를 실행하면 변수는 무엇을 반환합니까?

답변: my_list는 None이 됩니다. 왜냐하면 sort는 리스트를 제자리에서 정렬하고 None을 반환하기 때문입니다. 이것은 흔한 버그입니다: 항상 할당 없이 제자리에서 정렬하시거나, 새 리스트로 정렬된 객체가 필요할 경우 sorted()를 사용하세요.

코드 예시:

lst = [3, 1, 2] lst = lst.sort() # lst는 이제 None입니다.

sort() 메서드를 사용하여 튜플이나 문자열을 정렬할 수 있습니까?

답변: 아닙니다, 불변 객체(튜플, 문자열)에는 sort 메서드가 없지만, sorted()는 적용할 수 있으며, 이 경우 요소로부터 새 정렬된 리스트를 반환합니다.

코드 예시:

tpl = (4, 2, 7) sorted_tpl = sorted(tpl) # sorted_tpl = [2, 4, 7]

서로 다른 타입의 요소를 가진 리스트를 정렬할 수 있을까요?

답변: 파이썬 3에서는 서로 비교할 수 없는 타입(예: int와 str)을 정렬하면 TypeError가 발생합니다. 파이썬 2에서는 특정한 순서가 있었으나, 지금은 모든 값을 비교할 수 있는 형태로 일반화하려면 key 함수를 명시적으로 지정해야 합니다.

일반적인 오류 및 안티 패턴

  • sort/sorted의 반환 값을 혼동 — 데이터를 잃어버림.
  • key 없이 서로 비교할 수 없는 객체를 정렬하려는 시도 — 예외가 발생함.
  • “원본”이 필요한 경우, 큰 컬렉션을 제자리에서 정렬.
  • 정렬을 급격하게 느리게 만드는 비싼 key 함수를 사용함.

실제 사례

악성 사례

프로그래머가 my_list = my_list.sort()를 실행한 후, 원래 리스트에 대한 접근을 잃었습니다. 왜냐하면 변수에 None 값이 할당되었기 때문입니다.

장점:

  • 문법이 “논리적”으로 보입니다(초보자에게).

단점:

  • 데이터 접근을 잃게 되어, 대규모 프로젝트에서 버그를 쉽게 확인하지 못할 수 있으며, 프로그램이 런타임에서 실패할 수 있습니다.

긍정적 사례

원본을 변경하지 않고 새로운 버전을 얻기 위해 신중하게 sorted()를 사용하거나, 할당 없이 정확하게 sort를 적용했습니다.

장점:

  • 명확한 동작과 원본 데이터의 보존.
  • 반복 가능한 객체에 대한 유연성(리스트에 국한되지 않음).

단점:

  • sorted()를 사용할 경우 복사본이 생성되어, 매우 큰 컬렉션에 대해 메모리 소모가 더 크다.