코딩도장을 진행하다, Unit23의 sorted() 함수로 2차원 리스트 정렬하기에서 람다함수의 활용을 조우하실 수 있습니다.
sorted(), .sort()에서 람다 공략법입니다.
제가 이해한 방식으로 정리한 내용입니다.
students = [
['john', 'C', 19],
['maria', 'A', 25],
['andrew', 'B', 7]
]
print(sorted(students, key=lambda student: student[1]))
# 안쪽 리스트의 인덱스 1을 기준으로 정렬
>>>
[['maria', 'A', 25], ['andrew', 'B', 7], ['john', 'C', 19]]
print(sorted(students, key=lambda student: student[2]))
# 안쪽 리스트의 인덱스 2를 기준으로 정렬
>>>
[['andrew', 'B', 7], ['john', 'C', 19], ['maria', 'A', 25]]
# 기본 문법
print(sorted(순회가능한 객체, key= 함수))
# 순회가능한 객체(iterable) : list, tuple 등.
# 함수 : 정렬 기준
# 작동 순서
1. 함수에 순회가능한 객체의 요소들을 차례로 인자로 전달한다.
2. 전달받은 인자를 사용하여 반환받은 값들을 기준으로 '오름차순' 정렬한다.
3. 정렬한 순서로 순회가능한 객체의 요소를 리스트로 반환한다.
예)
>>> str_list = ['좋은하루','good_morning','굿모닝','niceday']
>>> print(sorted(str_list, key=len)) # 함수
['굿모닝', '좋은하루', 'niceday', 'good_morning']
# 풀이
1. len 함수에 str_list 의 요소들을 차례로 인자로 전달한다.
len('좋은하루') -> len('good_morning') -> len('굿모닝') -> len('niceday')
2. 전달받은 인자를 사용하여 반환받은 값들을 기준으로 오름차순 정렬한다.
반환값들 : 4 , 12 , 3 , 7
오름차순 정렬 : 3, 4, 7, 12
반환 하는 리스트 : ['굿모닝', '좋은하루', 'niceday', 'good_morning']
람다 예)
>>> str_list = ['좋은하루','good_morning','굿모닝','niceday']
>>> print(sorted(str_list, key=lambda x : x[1]))
['niceday', 'good_morning', '굿모닝', '좋은하루']
#풀이 # lambda 매개변수 : 표현식
1. lambda x : x[1] 함수에 str_list 의 요소들을 차례로 인자로 전달한다.
x = '좋은하루' -> x = 'good_morning' -> x = '굿모닝' -> x = 'niceday'
2. 전달받은 인자를 사용하여 반환받은 값들을 기준으로 오름차순 정렬한다.
반환값(표현식): x[1] : '은', x[1] : 'o' , x[1] : '모', x[1] : 'i'
오름차순 정렬 : 'i' , 'o', '모', '은'
반환하는 리스트 : ['niceday', 'good_morning', '굿모닝', '좋은하루']
#reverse 매개변수
기본값은 reverse=False(오름차순)이다.
reverse=True를 매개변수로 입력하면 내림차순으로 정렬할 수 있다.
>>> num_list = [15, 22, 8, 79, 10]
>>> num_list.sort(reverse=True)
>>> print(num_list)
[79, 22, 15, 10, 8]
>>> print(sorted(['좋은하루','good_morning','굿모닝','niceday'], reverse=True))
['좋은하루', '굿모닝', 'niceday', 'good_morning']
#여러 요소를 갖는 경우 튜플로 기준 우선순위를 만든다.
tuple_list = [
('좋은하루', 0),
('niceday', 1),
('좋은하루', 5),
('good_morning', 3),
('niceday',5)]
print(sorted(tuple_list, key=lambda x : (x[0], x[1])))
[('good_morning', 3), ('niceday', 1), ('niceday', 5), ('좋은하루', 0), ('좋은하루', 5)]
print(sorted(tuple_list, key=lambda x : (x[0], -x[1])))
# - 를 사용하여 역순으로 정할 수 있다.
[('good_morning', 3), ('niceday', 5), ('niceday', 1), ('좋은하루', 5), ('좋은하루', 0)]