[문법] Python 이것저것 (lambda, sort) - 1편

이우준·2023년 3월 28일
0

Python

목록 보기
2/3

Lambda

다음의 함수를 보자.

# n을 인자로 받아 세제곱 값을 반환
def cube(n):
  return n**3

이때, lambda를 사용하면 함수를 더 간결하게 작성할 수 있다.

# return 불필요, 이때 cube는 이름을 붙였다고 생각하면 된다
cube = lambda n: n**3

보통 간단한 함수를 선언할 때, 예를 들어, 한번 쓰고 말 경우에 사용한다고 생각하면 된다.

이제 두 경우가 온전히 같은지 비교하기 위해 아래의 코드를 보자.

def cube_def(n):
  return n**3

cube_lamb = lambda n: n**3

print(cube_def(3)) # 27
print(cube_lamb(3)) # 27

# test_list에 담긴 각 값에 대해서도 시도
test_list = [4, -1, 5, 9, -2]

for elem in test_list:
  # 만약 둘이 다른 함수라면 error가 발생
  assert(cube_def(elem) == cube_lamb(elem)) # Error 없음

assert('조건') 는 '조건'이 False인 경우 error를 발생시킨다.

Sort

List를 정렬해줄 수 있는 sort 함수에 대해 알아보자. 바로 아래 예제를 통해 sort의 활용법을 이해할 수 있다.

Sorting을 위해 사용할 수 있는 방법에는 크게 두 가지가 있다.

.sort()

# Sorting을 위해 크게 '.sort()' 와 'sorted()' 사용 가능
num_list = [-2, 1, 4, 8, -7]
num_list.sort() # 기본은 오름차순 정렬
print(num_list) # [-7, -2, 1, 4, 8]

이때 .sort() 만 적용했음에도 원래 list가 정렬된 것이 중요하다.

sorted()

num_list = [-2, 1, 4, 8, -7]

sorted(num_list)
print(num_list) # [-2, 1, 4, 8, -7]

num_list = sorted(num_list)
print(num_list) # [-7, -2, 1, 4, 8]

이때는 sorted() 가 어떤 변수에 선언되지 않으면, 원래의 list가 바뀌지 않는다는 것을 알 수 있다.

이어서 sorted() 의 option에 대해 알아보자. 만약 위의 예시에서 절댓값 크기를 기준으로 정렬하고 싶다면 아래와 같이 하면 된다.

num_list = [-2, 1, 4, 8, -7]

# 참고로, abs는 python 기본 내장 함수이다
num_list = sorted(num_list, key = abs) # key에 원하는 기준을 함수로 입력
print(num_list) # [1, -2, 4, -7, 8]

# 만약, 절대값이 큰 순서부터 정렬하고 싶다면 reverse를 사용하자
num_list = sorted(num_list, key = abs, reverse = True)
print(num_list) # [8, -7, 4, -2, 1]

조금 더 응용하면 lambda 를 선언한 뒤, dictionary를 정렬하는 것도 가능하다.

# 아래와 같은 dictionary를 선언하자 (참고로 알파벳 순서는 C-I-T-W 순)
movie_dict = {"Toy story":10, "Iron man":3, "Coco":17, "Wreck it ralph":9}

# Case 1. 기본 sorted() 적용, 영화 이름에 대해서만 알파벳 순서대로 정렬
movie_1 = sorted(movie_dict)
print(movie_1) # ['Coco', 'Iron man', 'Toy story', 'Wreck it ralph']

# Case 2. 영화 이름 (key) 기준, 사전 역순으로 정렬 -> tuple 형태로!
movie_2 = sorted(movie_dict.items(), key = lambda x: x[0], reverse = True) # x[0] 즉, 각 원소의 key를 읽으라는 뜻
print(movie_2) # [('Wreck it ralph', 9), ('Toy story', 10), ('Iron man', 3), ('Coco', 17)]

# Case 3. 숫자 (value) 기준, 오름차순으로 정렬 -> tuple 형태로!
movie_3 = sorted(movie_dict.items(), key = lambda x: x[1]) # Default가 'reverse = False'
print(movie_3) # [('Iron man', 3), ('Wreck it ralph', 9), ('Toy story', 10), ('Coco', 17)]

# Case 4. Case 3 에서 숫자가 큰 순서로 영화 이름만 나오게 하고 싶다면,
movie_4 = sorted(movie_dict, key = lambda x: movie_dict[x], reverse = True) # 'movie_dict'에 대해 sorted() 적용
print(movie_4) # ['Coco', 'Toy story', 'Wreck it ralph', 'Iron man']

# 원래의 dictionary는 변화 없음
print(movie_dict) # {'Toy story': 10, 'Iron man': 3, 'Coco': 17, 'Wreck it ralph': 9}

0개의 댓글