파이썬 list.sort()와 sorted()
파이썬의 정렬은 list.sort()와 sorted()를 주로 사용한다.
list.sort()는 리스트에 내장된 함수로 리스트에서만 쓸 수 있다. 반면에 sorted()는 리스트뿐만 아니라 딕셔너리나 튜플 같은 자료형에도 사용이 가능하다. 여러 자료형에 사용 가능한 sorted()가 더 좋아 보이지만, list.sort()는 리스트 그 자체에서 정렬이 이루어져(in-place) 정렬된 리스트를 따로 반환하지 않는다(None을 반환한다). 반대로 sorted()는 정렬된 값(리스트, 딕셔너리, 튜플,...)을 반환한다. sorted()가 더 편한 게 사실이지만, 정렬하기 전의 값이 필요하지 않다면 list.sort()가 더 효율적이다.
파이썬의 다중 정렬
c = [[1,2],[3,9],[2,7],[2,1],[2,4],[3,1]]
c.sort()
print(c)
# [[1, 2], [2, 1], [2, 4], [2, 7], [3, 1], [3, 9]]
위 코드의 결과값을 보면 모든 요소를 기준으로 오름차순 정렬했다. 파이썬의 기본은 오름차순이므로 이런 결과를 얻을 수 있다.
만약, 첫번째 열 값은 오름차순으로, 두 번째 열 값은 내림차순으로 정렬하고 싶다면 어떻게 해야 할까?
다음과 같이 key 매개변수에 lambda함수를 사용하면 된다.
c = [[1,2],[3,9],[2,7],[2,1],[2,4],[3,1]]
c.sort(key=lambda x:(x[0],-x[1]))
print(c)
# [[1, 2], [2, 7], [2, 4], [2, 1], [3, 9], [3, 1]]
익명함수 lambda
그럼 이제 람다에 대한 의문이 생긴다. 람다는 어떤 기능을 할까?
그전에 파이썬에 대해 잠깐 짚고 넘어가겠다. 일단 람다가 함수라는 것만 알아두자.
파이썬은 모든 것이 객체라서 함수도 객체이다. 우리가 함수를 만들 때 사용하는 def 키워드는 함수 클래스에 코드와 이름을 담아서 객체를 생성한 뒤, 그 객체를 함수 이름과 동일한 변수에 담아준다. (파이썬에서 객체의 타입은 객체를 만든 클래스를 의미하므로 함수 클래스로 만든 객체의 타입은 함수이다.)
이렇게 함수 객체를 변수에 담으면, 함수 객체가 메모리에 올라가서 변수를 통해 자신이 호출되기를 기다린다. 만약, 만든 함수를 단 한 번만 사용할 것이라면 이는 불필요한 메모리 낭비다. (낭비를 방지하게 위해서 del 키워드를 통해 변수와의 참조를 끊을 수 있으나 이는 개발자의 시간을 낭비한다.)
c = [[1,2],[3,9],[2,7],[2,1],[2,4],[3,1]]
c.sort(key=lambda x:(x[0],-x[1]))
print(c)
# [[1, 2], [2, 7], [2, 4], [2, 1], [3, 9], [3, 1]]
아까 람다를 사용했던 코드를 다시 보자. 위에서 람다도 함수라고 했는데 코드에서 단 한 번만 사용했다. 눈치챘겠지만 한 번만 호출할 함수를 메모리 낭비 없이 만들 수 있는 게 람다함수다. 그럼 제일 중요한 코드 해석은 어떻게 하면 될까?
그림 1처럼 람다함수를 사용하면 함수의 이름은 신경 쓰지 않아도 된다. 그래서 익명함수(anonymous function)라고 불리는 것이다. 람다 키워드와 콜론 사이의 값은 함수의 매개변수, 콜론 뒤의 값은 결과 값으로 생각하고 해석하면 된다.
콜론 뒤에는 한 개의 표현식만 들어간다. 여러 요소를 기준으로 정렬하고 싶다면 튜플(tuple)을 사용해서 정렬하고 싶은 순서대로 묶어준다. 내림차순을 하고 싶다면 요소 앞에 - 값을 붙이면 된다. 그래서 아까 코드의 표현식 부분에 (x [0],-x [1])가 들어간 것이다.
c = [[1,2],[3,9],[2,7],[2,1],[2,4],[3,1]]
c.sort(key=lambda x:(x [0],-x [1])) #따라서 이 코드는 변수 c의 첫 번째 열 값으로 오름차순,
print(c) #두 번째 열 값으로 내림차순 하는 코드가 된다.
# sorted()의 이중 정렬도 방법이 동일하다.
c = [[1,2],[3,9],[2,7],[2,1],[2,4],[3,1]]
print(sorted(c, key=lambda x:(x [0],-x [1])))
# [[1, 2], [3, 9], [2, 7], [2, 1], [2, 4], [3, 1]]
# [[1, 2], [3, 9], [2, 7], [2, 1], [2, 4], [3, 1]]
람다는 list.sort()와 sorted()의 key 매개변수로 자주 사용된다. 다만 key 매개 변수는 단일 인자만 취한다는 것을 꼭 기억하자!
다음은 포스팅하며 참고한 자료이다. 더 알고 싶다면 한번 들어가 봐도 좋을 것이다.
https://docs.python.org/ko/3/howto/sorting.html#sortinghowto
'개발 > Python' 카테고리의 다른 글
백준 1000번) 파이썬으로 에러날 때 (0) | 2021.02.06 |
---|