16.정렬, Operator Module
by SANGGI JEON
정렬
Python에서 sort는 Timesort를 사용하여 정렬한다. Timesort는 병합정렬과 퀵정렬에서 파생된 하이브리드 정렬이다.
https://en.wikipedia.org/wiki/Timsort
1. Sort
sort([reverse=True|False,] [key=myFunc])
sort()는 in-place에서 정렬하는 메소드이다. in-place에서 정렬한다는 것은 원본 데이터 공간에서 정렬을 하기 때문에 정렬을 하기 위한 추가 저장 공간이 필요하지 않다.
원본 데이터 내부에서 정렬하기 때문에 원본 데이터가 변한다.
1.1 기본적으로 오름차순 정렬을 지원한다.
a = [1, 3, 5, 4, 2]
a.sort()
print(a)
# 결과
[1, 2, 3, 4, 5]
1.2 내림차순 정렬을 하기 위해서는 reverse=True를 해주면 된다.
a = [1, 3, 5, 4, 2]
a.sort(reverse=True)
print(a)
1.3 key를 이용하여 정렬의 기준을 정해 줄 수 있다.
a = [[1, 2], [2, 5], [3, 4], [4, 3], [5, 2]]
a.sort(key=lambda x: x[1])
print(a)
# 결과
[5, 4, 3, 2, 1]
1.4 다중 수준으로 정렬할 수도 있다.
예를 들어, 각 리스트의 0번째 인자를 기준으로 오름차순 정렬하는데 값이 같을 경우 두번째 인자로 내림차순 정렬할 수 있다.
a = [[1, 2], [2, 5], [2, 4], [2, 3], [3, 2], [4, 6]]
a.sort(key=lambda x: (x[0], -x[1]))
print(a)
# 결과
[[1, 2], [2, 5], [2, 4], [2, 3], [3, 2], [4, 6]]
2. Sorted
Sorted는 iterable로부터 새로운 정렬된 리스트를 만드는 정렬 메소드이다. 새로운 정렬된 리스트를 만들기 때문에 원본 데이터는 변하지 않는다.
sort와 마찬가지로 reverse와 key를 가지고 있다.
2.1 기본적으로 오름차순 정렬을 지원한다.
a = [1, 3, 5, 4, 2]
b = sorted(a)
print(a)
print(b)
# 결과 원본 데이터인 a는 변하지 않은 것을 알 수 있음
[1, 3, 5, 4, 2]
[1, 2, 3, 4, 5]
2.2 내림차순 정렬을 하기 위해서는 reverse=True를 해주면 된다.
a = [1, 3, 5, 4, 2]
b = sorted(a, reverse=True)
print(b)
# 결과
[5, 4, 3, 2, 1]
2.3 key를 이용하여 정렬의 기준을 정해 줄 수 있다.
a = [[1, 2], [2, 5], [3, 4], [4, 3], [5, 2]]
b = sorted(a, key=lambda x: x[1])
print(b)
# 결과
[[1, 2], [5, 2], [4, 3], [3, 4], [2, 5]]
2.4 다중 수준으로 정렬할 수도 있다.
예를 들어, 각 리스트의 0번째 인자를 기준으로 오름차순 정렬하는데 값이 같을 경우 두번째 인자로 내림차순 정렬할 수 있다.
a = [[1, 2], [2, 5], [2, 4], [2, 3], [3, 2], [4, 6]]
b = sorted(a, key=lambda x: (x[0], -x[1]))
print(b)
[[1, 2], [2, 5], [2, 4], [2, 3], [3, 2], [4, 6]]
Operator 모듈 함수
파이썬은 액세스 함수를 더 쉽고 빠르게 만드는 함수를 제공하기 위해 operator 모듈을 제공한다. operator 모듈에는 itemgetter(), attrgetter(), methodcaller()가 있다.
1. itemgetter
student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
from operator import itemgetter
student_sort = sorted(student_tuples, key=itemgetter(2))
print(student_sort)
# 결과
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
다중 수준 정렬
from operator import itemgetter
student_sort = sorted(student_tuples, key=itemgetter(1, 2))
print(student_sort)
2. atregetter
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))
students = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]
from operator import attrgetter
student_sort = sorted(students, key=attrgetter('age'))
print(student_sort)
다중 수준 정렬
from operator import attrgetter
student_sort = sorted(student_objects, key=attrgetter('grade', 'age'))
print(student_sort)
Subscribe via RSS