What is Computer?/skill

[python] max, min 함수의 매개변수 key, default 활용

max(iterable, *[key, default])

min(iterable, *[key, default])

 

a = [5, 5, 4, 3, 2, 1, 0, 0]
b = [(data, idx) for idx, data in enumerate(a)]  # a에 index 정보를 추가한 형태
print(b)
# >> [(5, 0), (5, 1), (4, 2), (3, 3), (2, 4), (1, 5), (0, 6), (0, 7)]

위 리스트를 가지고 예제를 확인할 것임.

* 리스트 b는 리스트 a의 index 정보를 배열로 추가한 것임. (5, 0)과 (5, 1), (0, 6)과 (0, 7)을 max 또는 min 함수를 사용할 때 어떻게 반환할지 보기 위한 예제.

 

● 기본 예제

print(max(a))
# >> 5
print(min(a))
# >> 0
print(max(b))
# >> (5, 1) | (5, 0)가 아닌 (5, 1)이 출력됨. 2번째 원소인 1이 0보다 크므로 (max함수)
print(min(b))
# >> (0, 6) | (0, 7)이 아닌 (0, 6)이 출력됨. 2번째 원소인 6이 7보다 작으므로 (min함수)

 

● key 옵션을 사용한 예제

# max
print(max(b, key=lambda x: x[0]))
# >> (5, 0) | (5, 1)이 아님을 주의
print(max(b, key=lambda x: x[1]))
# >> (0, 7) | b[:][1]의 최댓값이 7이므로 (0, 7) 반환

# min
print(min(b, key=lambda x: x[0]))
# >> (0, 6) | min인 경우에는 min(b)와 같음. (max인 경우에는 달랐음)
print(min(b, key=lambda x: x[1]))
# >> (5, 0) | b[:][1]의 최솟값이 0이므로 (5, 0) 반환

# 번외 (abs 절댓값 활용)
print(max(b, key=lambda x: abs(x[1])))
# >> (0, 7) | 두 번째 원소 값의 절댓값이 제일 큰 것을 반환

max(b) VS max(b, key=lambda x: x[0]) >> (반환값이 다름. (5, 0)이냐? (5, 1)이냐?)

print(sorted(b, reverse=True))  # max()함수 베이스
# >> [(5, 1), (5, 0), (4, 2), (3, 3), (2, 4), (1, 5), (0, 7), (0, 6)]
# >> (5, 1), (5, 0) 순
print(sorted(b))  # max(iterable, key=func) 베이스
# >> [(0, 6), (0, 7), (1, 5), (2, 4), (3, 3), (4, 2), (5, 0), (5, 1)]
# >> (5, 0), (5, 1) 순

max(b) 함수는 sorted()함수에 reverse=True 옵션을 준 것처럼, 내림차순 정리를 한 뒤에 첫 번째 원소를 뽑게 됨. (위 코드 참고)

하지만,  max(b, key=lambda x:x[0]) 함수는 sort()한 리스트(=오름차순)에서 lambda 조건에 맞는 부분만 최댓값을 찾아주고 첫 번째 원소를 뽑고 있음. 

min 함수의 경우 오름차순으로 정리를 하고 첫 번째 원소를 뽑으므로, 주의할 요소가 없음.

● default 옵션을 사용한 예제

for _ in range(len(b) + 1):
    print(b)
    print(max(b, default=10))
    if len(b) == 0:
        exit(0)
    b.pop()
    
# >>
# [(5, 0), (5, 1), (4, 2), (3, 3), (2, 4), (1, 5), (0, 6), (0, 7)]
# (5, 1)
# [(5, 0), (5, 1), (4, 2), (3, 3), (2, 4), (1, 5), (0, 6)]
# (5, 1)
# [(5, 0), (5, 1), (4, 2), (3, 3), (2, 4), (1, 5)]
# (5, 1)
# [(5, 0), (5, 1), (4, 2), (3, 3), (2, 4)]
# (5, 1)
# [(5, 0), (5, 1), (4, 2), (3, 3)]
# (5, 1)
# [(5, 0), (5, 1), (4, 2)]
# (5, 1)
# [(5, 0), (5, 1)]
# (5, 1)
# [(5, 0)]
# (5, 0)
# []
# 10

max(iterable, default=value) 구조에서 iterable에 아무것도 없다면, default의 value값을 반환함.

위 예제는 리스트 b를 계속 pop해서 없애면 마지막에 default 값이 나와있는 것을 보여줌.

 

번외. sorted()함수에서 key 옵션에 lamda 함수 사용

print(sorted(b, key=lambda x: x[0]))
# >> [(0, 6), (0, 7), (1, 5), (2, 4), (3, 3), (4, 2), (5, 0), (5, 1)] | 기본 예제
print(sorted(b, key=lambda x: x[1]))
# >> [(5, 0), (5, 1), (4, 2), (3, 3), (2, 4), (1, 5), (0, 6), (0, 7)] | 기본 예제
print(sorted(b, key=lambda x: max(x)))
# >> [(3, 3), (4, 2), (2, 4), (5, 0), (5, 1), (1, 5), (0, 6), (0, 7)]
print(sorted(b, key=lambda x: min(x)))
# >> [(5, 0), (0, 6), (0, 7), (5, 1), (1, 5), (4, 2), (2, 4), (3, 3)]

※ lambda x: max(x)의 경우, 각 튜플에서 최댓값이 큰 것을 기준으로 sorted됨(=오름차순) | 

[(3, 3), (4, 2), (2, 4), (5, 0), (5, 1), (1, 5), (0, 6), (0, 7)]

(3, 3) 에서 3이 기준

(4, 2)에서 4가 기준

(2, 4)에서 4가 기준

(5, 0)에서 5가 기준

(5, 1)에서 5가 기준

(1, 5)에서 5가 기준

(0, 6)에서 6이 기준

(0, 7)에서 7이 기준 >> 기준이 같을 때는 두 번째 원소가 오름차순으로 됨. 

※ lambda x: min(x)의 경우, 각 튜플에서 최솟값이 작은 것을 기준으로 sorted됨(=오름차순) | 

[(5, 0), (0, 6), (0, 7), (5, 1), (1, 5), (4, 2), (2, 4), (3, 3)]

(5, 0)에서 0이 기준

(0, 6)에서 0이 기준

(0, 7)에서 0이 기준

(5, 1)에서 1이 기준

(1, 5)에서 1이 기준

(4, 2)에서 2가 기준

(2, 4)에서 2가 기준

(3, 3)에서 3이 기준 >> min도 max때와 마찬가지로, 기준이 같을 때는 두 번째 원소를 기준으로 오름차순 됨.

 

'What is Computer? > skill' 카테고리의 다른 글

알고리즘 테스트 벼락치기 (기본문제)  (0) 2022.03.04