[Python] 정렬 메소드 sort, sorted

정환우·2021년 2월 24일
0

Python 공부

목록 보기
3/3

실무는 잘 모르겠지만 코딩 테스트 연습을 하다보면 정렬 메소드를 사용하게 되는 일이 굉장히 많다. 정렬하는 함수를 직접 구현할 때도 있고, 라이브러리에 있는 함수를 사용할 때도 있는데, Python 언어에서 지원하는 sort, sorted 라는 정렬 메소드는 잘 알아두면 굉장히 편리하다. 자세히 알아보자.

sort와 sorted의 차이

# 형식

sort(*, key=None, reverse=False)

sorted(iterable, *, key=None, reverse=False)

사실 정렬하는 방식이나 받는 매개변수에는 차이가 없다고 무방하나, 이 두 함수의 가장 큰 차이는 원본 리스트를 수정하냐 안 하냐의 차이가 있다.
sort는 반환값이 없고 리스트 자체를 수정하고, sorted는 정렬한 리스트를 반환한다.

>>> a = [5, 2, 3, 1, 4]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]		# a리스트가 변한다.

>>> a = [5, 2, 3, 1, 4]
>>> b = sorted(a)
>>> a, b
[5, 2, 3, 1, 4] , [1, 2, 3, 4, 5]

reverse

기본적으로 내림차순 정렬이고, 기본형은 reverse = False 이다. 따로 명시를 해주지 않는 이상 다 이렇게 작동한다.

오름차순 정렬을 하고 싶으면 reverse = True 를 하면 된다.

a = [4,3,2,1,5]
b = sorted(a,reverse=True)
print(b)
>>> [5, 4, 3, 2, 1]

Key Functions

여기까지는 이해가 쉬운데, 이 key를 어떻게 다루냐에 따라 정렬 라이브러리를 활용하는지 안하는지 엄청난 차이가 생긴다.

키 값에는 정렬을 목적으로 하는 함수가 들어간다.
(The value of the key parameter should be a function (or other callable) that takes a single argument and returns a key to use for sorting purposes.)
파이썬 공식 문서에 저렇게 적혀 있다. 예제를 보면서 이해를 해보자.

sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

# key값으로 str.lower가 들어감

그리고 내가 이 정렬 라이브러리에서 가장 미친 기능이라고 생각하는게 원하는 값을 기준으로 정렬이 가능하다.

>>> student_tuples = [
...     ('john', 'A', 15),
...     ('jane', 'B', 12),
...     ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

클래스 처럼 지정된 이름으로도 설정이 가능하다.

>>> class Student:
...     def __init__(self, name, grade, age):
...         self.name = name
...         self.grade = grade
...         self.age = age
...     def __repr__(self):
...         return repr((self.name, self.grade, self.age))
>>>
>>> student_objects = [
...     Student('john', 'A', 15),
...     Student('jane', 'B', 12),
...     Student('dave', 'B', 10),
... ]
>>> sorted(student_objects, key=lambda student: student.age)   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

더 미친건 operator 모듈을 사용하면 두 가지 값을 고려하여 정렬하는 기능도 있다...

>>> from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
#'B' 로 같을 때 10이 작으니까 dave가 먼저온다.

# 클래스와 같이 이름으로 가져올 수 있을 때
>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

나는 정말 이건 미친 기능이라고 생각한다. 꼭 알아두자....!

profile
Hongik CE

0개의 댓글