2022. 11. 16. 20:15ㆍProgramming/Python
[Python] sort & sorted
파이썬에서 리스트 사용 시 기본적으로 제공이 되는 메서드들이다. 둘 다 똑같이 주어진 리스트를 정렬하는 메서드이며 차이점에 대해 정리하려고 한다.
sort & sorted의 인자
sort와 sorted의 경우 두 가지의 인자로 해당 리스트의 값들을 반환한다. 각 요소들은 선택적이며 따로 지정하지 않으면 기본 값으로 들어간다.
- key
- 선택적으로 넣는 인자 / 정렬이 되는 기준 메서드를 지정할 수 있다.
- 해당 부분에는 lambda를 넣어 function인자를 채울 수도 있다.
- 여러 개의 요소를 가지고 있는 경우 해당 키를 통해 어느 요소를 우선적으로 사용할지 정할 수 있다.
- key의 default값은 None이며 생략 시 default값으로 들어간다.
- 선택적으로 넣는 인자 / 정렬이 되는 기준 메서드를 지정할 수 있다.
- reverse
- 정렬을 하면서 해당 정렬을 오름차순으로 할지 내림차순으로 할지 정하는 인자
- 기본값은 reverse = False로 설정이 되어있으며 오름차순이다.
- 오름차순 이용 시에는 그대로 생략하고 입력하면 된다. 내림차순의 경우 reverse=False로 설정하면 된다
시간 복잡도의 경우 TimSort (삽입 정렬 + 병합 정렬)을 사용하기에 최소 o ( n ) / 최대 o ( n log ( n ) )을 보장한다고 한다.
https://d2.naver.com/helloworld/0315536
# sort() 기준
# 기본적인 문법의 형태
list.sort(reverse=True|False, key=myFunc)
# 기본 형태
cars = ['Ford', 'BMW', 'Volvo']
cars.sort()
# key를 사용한 정렬
# dictionary의 year값을 기준으로 정렬
def myFunc(e):
return e['year']
cars = [
{'car': 'Ford', 'year': 2005},
{'car': 'Mitsubishi', 'year': 2000},
{'car': 'BMW', 'year': 2019},
{'car': 'VW', 'year': 2011}
]
cars.sort(key=myFunc)
# 역순, 내림차순 정렬
cars.sort(key=myFunc, reverse = True)
sort() 메서드의 경우 기존 주소 값에서 기존 데이터를 정렬하여 수정을 하기에 새로운 리스트를 반환하지 않는다.
이제 sorted에 대해 정리해보자
sorted의 경우 앞에서 본 sort에 인자가 하나 더 추가가 된다. 바로 정렬하고자 하는 리스트 및 iterator를 인자로 받아온다.
리스트와 iterator?
sort()의 경우 리스트만 받아와서 정렬을 하지만 sorted의 경우 리스트를 포함한 모든 iterator를 받을 수 있다
# iterator 받아서 정렬
a = (1, 11, 2)
x = sorted(a)
# iterator 및 내림차순
a = ("h", "b", "a", "c", "f", "d", "e", "g")
x = sorted(a, reverse=True)
또한 sort() 메서드의 경우 기존의 리스트를 받아와서 정렬을 한다면
sorted() 메서드의 경우 정렬 후 새로운 변수에 할당이 되기에 기존 iterator를 보존하고 정렬이 된 iterator도 사용할 수 있다
sorted()의 경우에는 받아온 iterator를 정렬 후 새로운 iterator로 반환하여 새로운 리스트로 반환한다.
이러한 차이로 인해 sort로는 반환 즉시 새로운 리스트로 선언을 하지 못하였고
sorted의 경우 새로운 리스트를 또 다른 변수에 선언해줄 수 있었다.
sorted() 여러개의 키값으로 정렬 ,
sorted()의 경우 key값으로 함수를 받아 정렬의 기준을 정해줄 수 있다. 정렬을 여러 번 해야 하는 상황이 존재하면 해당 정렬의 기준을 여러 개 받을 수 있다. 문제를 풀다 보면 그러한 상황을 마주칠 수 있으며 그 예시로 풀어볼 문제가 바로 아래의 문제이다.
코딩 테스트 연습 - 문자열 내 마음대로 정렬하기 | 프로그래머스 스쿨 (programmers.co.kr)
def solution(strings, n):
'''
주어진 문자열에 sorted 메서드 사용
sorted의 경우 시간복잡도 O(n) / O(n log n), 각각 최선/ 최악
sorted의 key를 사용
1.문제에서 주어진 n번째 idx를 기준으로 정렬
2.문제에서 주어진 사전순 정렬을 위해 key값 추가로 넣기
3.키값의 조건이 n번째 정렬이 우선이므로 lambda의 정렬조건을 n번째 / 0에서 n번까지, n+1에서 끝까지로 정렬한다.
'''
return sorted(strings, key = lambda word : (word[n], word[0:n],word[n+1:]))
위의 상황에서 마지막 return 값 쪽에서 sorted 함수를 사용하였다. 그리고 함수 내에는 지금부터 설명할 람다식이 key값으로 들어가 있다.
문제에서 주어진 조건을 맞추기 위해 정렬을 기준으로 하는 idx들을 기준으로 값을 넣어주었다.
- 람다 식 요소 비교에 튜플로 하여 넣어주었다
- 만약 비교대상이 n번째 인덱스만 비교를 하는 것이었으면 key = lambda word : word[n] 으로 식이 마무리
- 비교대상이 여러 개이기에 튜플로 비교대상의 순서를 정해서 묶어줌
- n번째 idx, 처음부터 n-1까지의 idx, n+1부터 마지막까지 idx 비교
- 만약 정렬 대상을 내림차순으로 비교하고 싶을 경우 내림차순 정렬을 원하는 비교 부분에 -를 붙여주면 된다.
참고
Python List sort() Method (w3schools.com)
Python sorted() Function (w3schools.com)
'Programming > Python' 카테고리의 다른 글
[Python] n진법 변환 (0) | 2022.11.24 |
---|---|
[Python] 문자열 인덱싱 / 슬라이싱 (0) | 2022.11.15 |
[Python] 파이썬 with이란? (0) | 2022.09.12 |
[Python] 알고리즘 - 파이썬 (0) | 2022.07.02 |
[Python] sys.stdin.readline() vs input() (0) | 2022.03.23 |