[Python] sort & sorted

2022. 11. 16. 20:15Programming/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)

 

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()로 새로운 변수를 지정하여 출력

 

sorted()의 경우에는 받아온 iterator를 정렬 후 새로운 iterator로 반환하여 새로운 리스트로 반환한다.

이러한 차이로 인해 sort로는 반환 즉시 새로운 리스트로 선언을 하지 못하였고

sorted의 경우 새로운 리스트를 또 다른 변수에 선언해줄 수 있었다.

 

sorted() 여러개의 키값으로 정렬 , 

 

sorted()의 경우 key값으로 함수를 받아 정렬의 기준을 정해줄 수 있다. 정렬을 여러 번 해야 하는 상황이 존재하면 해당 정렬의 기준을 여러 개 받을 수 있다. 문제를 풀다 보면 그러한 상황을 마주칠 수 있으며 그 예시로 풀어볼 문제가 바로 아래의 문제이다.

코딩 테스트 연습 - 문자열 내 마음대로 정렬하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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 List sort() Method

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

Python sorted() Function (w3schools.com)

 

Python sorted() Function

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.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