class의 객체를 특정 기준에 따라 정리하기 위해서는 지난 글에서 다뤘던 람다 함수의 개념을 알아야 한다.
https://devwon-1999.tistory.com/46
파이썬 람다(lambda) 함수
람다함수는 코드의 간결화와 메모리 절약을 위해 사용하는 이름이 없는 익명 함수이다. 일반함수 임의의 값을 인자 값으로 넘겨받아 10을 곱한 뒤 반환하는 함수는 아래와 같이 작성할 수 있다.
devwon-1999.tistory.com
● 기본 코드
class student:
def __init__(self, name, height, weight):
self.name = name
self.height = height
self.weight = weight
students = [
student("Kim", 165, 80),
student("Lee", 170, 60),
student("Park", 175, 70),
student("Kang", 160, 100),
student("Moon", 180, 90),
]
for i in range(len(students)):
print(students[i].name, students[i].height, students[i].weight)
출력결과:
Kim 165 80
Lee 170 60
Park 175 70
Kang 160 100
Moon 180 90
위의 예시 코드에서 키 혹은 몸무게를 기준으로 정렬을 하고 싶을때는 람다함수를 활용하면된다.
● 오름차순
class student:
def __init__(self, name, height, weight):
self.name = name
self.height = height
self.weight = weight
students = [
student("Kim", 165, 80),
student("Lee", 170, 60),
student("Park", 175, 70),
student("Kang", 160, 100),
student("Moon", 180, 90),
]
students.sort(key = lambda x: x.height)
for i in range(len(students)):
print(students[i].name, students[i].height, students[i].weight)
출력결과:
Kang 160 100
Kim 165 80
Lee 170 60
Park 175 70
Moon 180 90
위와 같이 sort함수에 key라는 인자를 정렬의 기준으로 줄 수 있다. 해당 키는 람다함수를 통해서 넘겨주면 간단하게 코드 작성이 가능하다. 위 결과값을 통해 키를 기준으로 오름차순 정렬이 된걸 알 수 있다.
● 내림차순
반대로 내림차순을 원한다면 위의 sort코드에서 -만 추가하면된다.
class student:
def __init__(self, name, height, weight):
self.name = name
self.height = height
self.weight = weight
students = [
student("Kim", 165, 80),
student("Lee", 170, 60),
student("Park", 175, 70),
student("Kang", 160, 100),
student("Moon", 180, 90),
]
students.sort(key = lambda x: -x.height)
for i in range(len(students)):
print(students[i].name, students[i].height, students[i].weight)
출력결과:
Moon 180 90
Park 175 70
Lee 170 60
Kim 165 80
Kang 160 100
내림차순을 하는 방법은 reversed도 사용할 수 있지만 람다함수에서 - 하나만 붙이는 것으로 같은 동작을 한다.
● 우선순위 정렬
정렬을 할때 키를 기준으로 오름차순 정렬 후 키가 같은 경우 몸무게를 기준으로 오름차순 정렬을 원한다면
람다함수의 x 값에 더 추가해주면 된다.
class student:
def __init__(self, name, height, weight):
self.name = name
self.height = height
self.weight = weight
students = [
student("Kim", 165, 80),
student("Lim", 165, 70),
student("Ma", 170, 90),
student("Lee", 170, 60),
student("Park", 175, 70),
student("Kang", 160, 100),
student("Moon", 180, 90),
]
students.sort(key = lambda x: (x.height, x.weight))
for i in range(len(students)):
print(students[i].name, students[i].height, students[i].weight)
출력 결과:
Kang 160 100
Lim 165 70
Kim 165 80
Lee 170 60
Ma 170 90
Park 175 70
Moon 180 90
출력결과에서의 Lim, Kim 그리고 Lee, Ma와 같이 같은 키일 경우 몸무게를 기준으로 정렬이 되는 것을 볼 수 있다
class student:
def __init__(self, name, height, weight):
self.name = name
self.height = height
self.weight = weight
students = [
student("Kim", 165, 80),
student("Lim", 165, 70),
student("Ma", 170, 90),
student("Lee", 170, 60),
student("Park", 175, 70),
student("Kang", 160, 100),
student("Moon", 180, 90),
]
students.sort(key = lambda x: (x.height, -x.weight))
for i in range(len(students)):
print(students[i].name, students[i].height, students[i].weight)
출력결과:
Kang 160 100
Kim 165 80
Lim 165 70
Ma 170 90
Lee 170 60
Park 175 70
Moon 180 90
위와 같이 람다함수의 반환 값을 ()로 묶어서 각각 오름차순과 내림차순을 섞어서 사용할 수 있다.
위코드는 키를 기준으로 오름차순, 몸무게를 기준으로 내림차순 정렬을 하는 코드이다.
● 정렬 기준
정렬의 기준이 단순히 값이 아닌 키와 몸무게의 합을 기준으로도 정렬할 수 있다.
class student:
def __init__(self, name, height, weight):
self.name = name
self.height = height
self.weight = weight
students = [
student("Kim", 165, 80),
student("Lim", 165, 70),
student("Ma", 170, 90),
student("Lee", 170, 60),
student("Park", 175, 70),
student("Kang", 160, 100),
student("Moon", 180, 90),
]
students.sort(key = lambda x: -(x.height + x.weight))
for i in range(len(students)):
print(students[i].name, students[i].height, students[i].weight)
출력 결과:
Moon 180 90
Ma 170 90
Kang 160 100
Kim 165 80
Park 175 70
Lim 165 70
Lee 170 60
위와 같이 람다함수 반환값을 작성하는 곳에 전체 괄호로 묶어 합해준뒤 내림차순 정렬을 할 수 있다.