Python : Key 이용하기
- 프로그래밍 언어/파이썬
- 2022. 4. 4.
Python Key
그동안 가내수공업으로 필요한 함수들을 구현해왔었다. 그렇지만 파이썬의 Key 파라메터와 함께 내장모듈을 이용하면 좀 더 편리하게 코드를 구현할 수 있고, 덕분에 가독성이 향상되고 코드의 크기도 줄어든다. 따라서 안 쓸 이유가 없는데, 그동안 제대로 정리된 적이 없었기 때문에 선뜻 사용하지는 못하고 있었다. 이번에 살짝 정리를 해보려고 한다.
min, max 함수에 사용하기
min, max 함수를 살펴보면 옵션에 Key가 있는 것을 확인할 수 있다. min, max 함수를 이용해 값을 구할 때 key에 min, max를 구할 조건을 지정해준다고 이해를 해주면 될 것 같다.
a = np.random.randint(0,100,50)
print(a)
Numpy로 Random 값을 만들고 출력했다.
max_value = max(a, key = lambda x : [0 if x > 50 else x])
print(max_value)
그리고 위 Random 값에서 최대값을 찾아보려고 했다. key에 어떠한 값을 주지 않았다면 당연히 95가 최대값이 나왔을 것이다. 그런데, key에 람다함수로 특정 처리를 한 후 최대값을 구하도록 했다. 람다 함수에는 iterable한 "a"라는 것이 넘어갔는데, a는 하나씩 component를 꺼내준다. 그리고 그 Component가 x가 되고, 각 x에서 대해서 x가 50보다 크면 0으로 처리하고, 나머지는 x가 그대로 나오도록 했다.
결론은 50이상인 애들은 0으로, 나머지는 그대로인 Iterable로 환산이 될 것이고, 그것에 대해 Max값을 구하게 된다.
따라서, 값을 구하게 되면 다음과 같이 34라는 값이 나오게 된다.
min, max 함수에 사용하기 2
START, SIZE = min(unUsedStart.items(), key=lambda x: (x[1], x[0]) if x[1] >= size else (99999999, 999999999))
이 경우, min 함수에 lambda 함수까지 섞어서 사용한 것이다. 동작 방식은 다음과 같다.
- 최소값의 기준을 x[1]을 먼저 비교하고, 같은 경우에 x[0]으로 비교한다.
- 이 때, x[1]의 값이 size보다 작은 경우는 그 원소를 999999,99999로 바꾸어 계산한다. 이 때, 논리적으로 바뀌는 것이고 실제 값이 바뀌지 않는다. → 만약 이 값이 출력되게 된다면, 값은 999999가 나오는게 아니라 실제 값이 나오게 된다.
- 예를 들어 저기에 해당하는 값이 (3,9)였는데 99999,99999로 바꾸어 연산하게 되었다고 가정해보자. 그리고 이 때, 아무리 정렬해도 이 값이 나와야만 하는 순간이라고 한다면... 실제로 START, SIZE에 나오는 값은 3,9가 된다.
sort에 사용하기
sorted / sort에도 key라는 파라메터를 줄 수 있다. 여기서는 결국 어떤 값을 기준으로 정리를 할지를 설정하는 것이다. 주로 key에 대해서 Lambda 함수를 던져준다. 그리고 이 때, Lambda 함수에 리스트 / 튜플 형식으로 던져줄 수 있다.
a = np.random.randint(0,100,20)
b = np.random.randint(0,100,20)
c = [(x,y) for x,y in zip(a,b)]
예를 들어 다음과 같이 c라는 리스트가 만들어진다고 해보자.
c = sorted(c, key = lambda x : (-(x[0] + x[1]), -x[1]))
이 때, c를 sort할 때, key에 다음과 같은 값을 줄 수 있다. 튜플 형식으로 주었는데, 첫번째 조건으로 Sorting하고, 그리고 Sorting 되면 두번째 조건으로도 막간을 이용해 Sorting 하라는 말이다.
첫번째는 (x[0] + x[1])을 주었으니 c[0][0] + c[0][1] / c[1][0] +c[1][1] / ... / c[n][0] + c[n][1]을 한 값들을 기준으로 오름/내림차순으로 정렬을 한다. 이 때 이 항목에 앞에 -를 주었기 때문에 Reverse로 정렬이 된다. 그리고 두번째 Component로 -x[1]로 주었기 때문에 1번 조건으로 정렬하고, 그 정렬한 값들 사이에서 값을 정렬할 때 x[1]의 크기의 역순으로 정렬하는 방식이 된다.
sort 예시
정리
다음과 같이 key를 사용하면, 가내수공업으로 한 줄 한 줄 짜야하는 함수를 아주 손쉽게 정리할 수 있다. 명시성이 조금 떨어지는 것 같긴 한데, 어차피 코드가 길어지면 명시성이 떨어지는 건 마찬가지인 거 같다. 쓸 수 있을 때 적극적으로 사용하자.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
Hash Key 생성 : Hornor's Method 활용 (0) | 2022.04.05 |
---|---|
Python : Deque (0) | 2022.04.04 |
파이썬 문자열 Concat 시간복잡도 (0) | 2022.02.20 |
파이썬 Map, Filter, Lambda, Sorted 함수 (0) | 2021.09.23 |
파이썬 소수점 표현하기 (0) | 2021.09.23 |