Python : Key 이용하기

    Python Key 

    그동안 가내수공업으로 필요한 함수들을 구현해왔었다. 그렇지만 파이썬의 Key 파라메터와 함께 내장모듈을 이용하면 좀 더 편리하게 코드를 구현할 수 있고, 덕분에 가독성이 향상되고 코드의 크기도 줄어든다. 따라서 안 쓸 이유가 없는데, 그동안 제대로 정리된 적이 없었기 때문에 선뜻 사용하지는 못하고 있었다. 이번에 살짝 정리를 해보려고 한다. 

     

    min, max 함수에 사용하기

    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 함수까지 섞어서 사용한 것이다. 동작 방식은 다음과 같다.

    1. 최소값의 기준을 x[1]을 먼저 비교하고, 같은 경우에 x[0]으로 비교한다.
    2. 이 때, 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를 사용하면, 가내수공업으로 한 줄 한 줄 짜야하는 함수를 아주 손쉽게 정리할 수 있다. 명시성이 조금 떨어지는 것 같긴 한데, 어차피 코드가 길어지면 명시성이 떨어지는 건 마찬가지인 거 같다. 쓸 수 있을 때 적극적으로 사용하자. 

    댓글

    Designed by JB FACTORY