문제의 역사:
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()는 더 일반적이며 모든 반복 가능한 객체에서 작동합니다.내가 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 함수를 명시적으로 지정해야 합니다.
악성 사례
프로그래머가 my_list = my_list.sort()를 실행한 후, 원래 리스트에 대한 접근을 잃었습니다. 왜냐하면 변수에 None 값이 할당되었기 때문입니다.
장점:
단점:
긍정적 사례
원본을 변경하지 않고 새로운 버전을 얻기 위해 신중하게 sorted()를 사용하거나, 할당 없이 정확하게 sort를 적용했습니다.
장점:
단점: