sorted(), .sort()에서 조우한 익명함수 lambda_파이썬 일기토

허남철·2022년 1월 3일
2

파이썬 일기토

목록 보기
1/1

코딩도장을 진행하다, 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 매개변수
기본값은 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)]

참고자료
https://ooyoung.tistory.com/59

profile
AI꿈나무

0개의 댓글