lambda
람다는 생각보다 많은 곳에서 쓰일 수 있다. 이번에 문제를 해결하다가 알게 된 기술을 복습할 겸 블로그에 기술해본다.
기본적으로 람다는 개별적으로 함수를 작성하지 않고 간단하게 덧붙일 때 많이 사용하는 편이다. 본인은 그 중에서도 2차원 리스트를 sort할 때 가장 많이 사용하는 듯 하다.
arr = [[1, 45], [2, 34], [3, 55], [4, 66], [5, 59], [6, 75] , [7, 79]]
arr.sort(key=lambda x : x[1]) # 2번째 인덱스를 기준으로 오름차순 정렬
print(arr)
>>>
[[2, 34], [1, 45], [3, 55], [5, 59], [4, 66], [6, 75], [7, 79]]
위와 같이 말이다. 그런데 문제를 풀다 보니 궁금한 점이 생겼다. 리스트의 평균값과 가장 가까운 값의 인덱스를 찾을 수는 없을까? 간단하게 찾는 법이 뭐가 있을까?
위의 리스트를 예로 바로 구현해보자.
우선 리스트의 평균값을 구해보자.
arr = [[1, 45], [2, 34], [3, 55], [4, 66], [5, 59], [6, 75] , [7, 79]]
# idx 1을 기준으로 오름차순 정렬
arr.sort(key=lambda x : x[1])
# 정렬된 값 중 idx 1의 값만 빼옴
arr2 = list(map(lambda x: x[1], arr))
# 소수자리 반올림
avg = int(sum(arr2) / len(arr2) + 0.5)
>>>
arr2는 [34, 45, 55, 59, 66, 75, 79]가 나올 것이고
avg는 59가 나올 것이다.
평균값을 구했으니 이제 본격적으로 평균과 가장 차이가 작은 값의 인덱스를 찾아보자. 단 한 줄로 정리된다.
arr = [[1, 45], [2, 34], [3, 55], [4, 66], [5, 59], [6, 75] , [7, 79]]
# idx 1을 기준으로 오름차순 정렬
arr.sort(key=lambda x : x[1])
# [[2, 34], [1, 45], [3, 55], [5, 59], [4, 66], [6, 75], [7, 79]]
# 정렬된 값 중 idx 1의 값만 빼옴
arr2 = list(map(lambda x: x[1], arr))
# 소수자리 반올림
avg = int(sum(arr2) / len(arr2) + 0.5)
# arr에서 평균과 가장 가까운 값의 인덱스
idx = min(range(len(arr)), key=lambda x: abs(arr[x][1]-avg))
print(idx)
>>>
3
중요한 부분은 역시 idx 옆에 min 함수 부분이다.
min 함수에도 key=lambda를 이용해 원하는 방식의 최솟값을 구할 수 있다.
우선 range(len(arr))는 [0, 1, 2, 3, 4, 5, 6]을 반환한다. len(arr)가 7이기 때문이다.
이제 key=lambda x: 부분에서 x는 [0, 1, 2, 3, 4, 5, 6]을 지칭한다.
또한 절댓값을 구하는 함수인 abs를 이용해 arr[x][1], 즉 [[2, 34], [1, 45], [3, 55], [5, 59], [4, 66], [6, 75], [7, 79]]을 순회하며 각 리스트 속 2번째 값만 추출해 평균과의 절댓값을 구하게 된다.
즉 [34 - 59, 45 - 59, 55 - 59, 59 - 59, 66 - 59, 75 - 59, 79 - 59] 값들의 절댓값이 각각 구해지게 된다. 이 값에서 최솟값은 59 - 59이고, 애초에 min 함수의 주체는 range(len(arr)), 즉 [0, 1, 2, 3, 4, 5, 6] 리스트이기 때문에 3이 반환되게 된다.
본인은 논리적으로 말하는 걸 잘 못해서.. 직접 그려보았다.
'◎ Python > 알게된 것 정리' 카테고리의 다른 글
[Pandas] 특정한 값을 만족하는 행의 개수 세기 (0) | 2023.10.04 |
---|---|
[Python 정리] for문에서 이전 요소를 다음 요소에 덮어씌우는 방법? (0) | 2023.06.09 |
[Python 정리] 내장함수 zip, filter에 대하여 (0) | 2022.09.26 |
[Python 정리] if __name__ == "__main__": 의 의미, 활용법 (2) | 2022.09.24 |
[Python 정리] 프로퍼티, setter, 프라이빗 속성이란? (0) | 2022.09.24 |
자기계발 블로그