상세 컨텐츠

본문 제목

Deep, Shallow Copy (3) - sorted vs sort

개발/python-심화(Advanced)

by Matthew0633 2022. 4. 30. 00:32

본문

지난 두번에 걸쳐 deep copy 와 shallow copy 가 일어날 수 있는 비슷해보이는 함수 또는 연산을 비교해보았다. 마지막으로 같은 관점에서 sorted 함수와 sort 함수 를 살펴보자

 

sort vs sorted 함수

List를 정렬할 때 가장 많이 사용되는 함수는 두가지로, sort()와 sorted() 함수이다. 이 두가지 함수는 List의 원소를 정렬하는 것으로 동일하지만, 사용결과에 따른 차이가 명확하게 존재한다. 아래 예시를 보자

# sorted : 정렬 후 새로운 객체 반환
f_list = ['orange', 'apple', 'mango', 'papaya', 'lemon', 'strawberry', 'coconut']

print('sorted -', sorted(f_list))       # sorted - ['apple', 'coconut', 'lemon', 'mango', 'orange', 'papaya', 'strawberry']
print('sort -', f_list.sort(), f_list)  # sort - None ['apple', 'coconut', 'lemon', 'mango', 'orange', 'papaya', 'strawberry']

사용방식의 차이 : sort 함수는 List의 메소드처럼 쓰이는 반면, sorted 함수는 builtin 함수로서 정렬하고자 하는 List 객체를 인자로 받아 사용된다.

return 결과의 차이 : deep copy와 shallow copy 차이를 살펴보는데 가장 중요한 부분이다. sort 함수는 List객체를 내부적으로 정렬하여 inplace 방식으로 수정하는 반면, sorted 함수는 인자로 들어온 List를 복사하여 새로운 List를 정렬하고 return 한다. 따라서 sort 함수는 해당 메소드를 실행한 주체인 List 객체를 정렬한 뒤, None을 return 하고, sorted 함수는 인자로 들어온 객체는 직접 수정하지 않고, 이를 복사하고 수정한 새로운 List 객체를 return 한다.

 

sorted, sort 함수 사용 advanced code

아래는 두 함수의 내림차순 방식, 그리고 함수를 활용하여 custom한 정렬방식을 설정하는 코드 예시이다.

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

print('before sorted -', f_list)

print()

# sort : 정렬 후 객체 직접 변경

# 반환 값 확인(None)

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)

"""
Outputs:

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']

before sorted - ['orange', 'apple', 'mango', 'papaya', 'lemon', 'strawberry', 'coconut']

sort - None ['strawberry', 'papaya', 'orange', 'mango', 'lemon', 'coconut', 'apple']
sort - None ['mango', 'lemon', 'apple', 'papaya', 'orange', 'coconut', 'strawberry']
sort - None ['papaya', 'apple', 'orange', 'lemon', 'mango', 'coconut', 'strawberry']
sort - None ['strawberry', 'coconut', 'mango', 'lemon', 'apple', 'orange', 'papaya']
"""

관련글 더보기

댓글 영역