⬆️ 내가 과거에 작성했던 글인데, 완벽히 이해하지 못하고 작성한 글이라서 이번에 다시 정리해보려고 한다.
리스트에서 최댓값, 최솟값 구하기
리스트의 최댓값과 최솟값을 구하는 가장 간단한 방법은 바로 max()
, min()
을 이용하는 방법이다.
알고리즘 문제를 풀 때 이 내장 함수들을 아주 유용하게 사용해 왔는데, '2차원 리스트에서 최댓값과 최솟값을 구할 때도 똑같이 동작하겠지~'라고 별생각 없이 max()
, min()
을 사용했다가 된통 당해버렸다🥲
다음과 같이 2차원 리스트가 있을 때, min_val = min(data)
, max_val = max(data)
로 최솟값과 최댓값을 구하려고 했다.
data = [[6, 8, 2, 6, 2],
[3, 2, 3, 4, 6],
[6, 7, 3, 3, 2],
[7, 2, 5, 3, 6],
[8, 9, 5, 2, 7]]
min_val = min(data)
max_val = max(data)
의도한 결과는 다음과 같이, 모든 리스트를 통틀어서 가장 큰 값인 9
, 가장 작은 값인 2
를 얻는 것이었다.
min_val: 2
max_val: 9
하지만 실행 결과는 다음과 같았다.
min_val: [3, 2, 3, 4, 6]
max_val: [8, 9, 5, 2, 7]
알고 보니 min()
과 max()
은 다음과 같이 동작해서 1차원 리스트일 때 적용했던 코드로는 원하는 결과를 얻어낼 수 없는 것이었다.
- 1차원 리스트에서
min()
은 가장 작은 원소,max()
는 가장 큰 원소를 반환한다. - 2차원 리스트의 경우, 원소들을 순차적으로 비교하여 결괏값(1차원 리스트)을 반환한다.
다음 코드를 통해 2차원 리스트에서의 동작 원리를 더 자세히 살펴보자!
data = [[1, 2, 3], [5], [0, 1, 100]]
print(min(data)) # [0, 1, 100]
print(max(data)) # [5]
리스트의 첫 번째 원소부터 대소 비교를 하여 결괏값을 낸다는 것을 확인할 수 있다.
그러면 2차원 리스트에서 최솟값 하나, 최댓값 하나를 어떻게 구해야 할까?
가장 간단한 방법은 for문을 이용하여 직접 구현하는 것이다.
for문을 이용하는 방법
def find_min_max_2d(data):
if not data:
return None, None
min_val = data[0][0]
max_val = data[0][0]
for row in data:
for num in row:
min_val = min(min_val, num)
max_val = max(max_val, num)
return min_val, max_val
data = [[6, 8, 2, 6, 2],
[3, 2, 3, 4, 6],
[6, 7, 3, 3, 2],
[7, 2, 5, 3, 6],
[8, 9, 5, 2, 7]]
min_val, max_val = find_min_max_2d(data)
print(min_val) # 2
print(max_val) # 9
위와 같이 코드를 작성하면 전체 리스트 원소 중에서 가장 작은 값
과 가장 큰 값
하나를 얻어낼 수 있다.
하지만 매번 이렇게 for문을 이용해서 구현하는 것은 너무 번거롭다.🥲
내가 원하는 것은 1차원 리스트에서처럼 코드 한 줄로 2차원 리스트의 최댓값과 최솟값을 얻어내는 것이다.
map()
과 min()
, max()
를 이용하면 최솟값과 최댓값을 아주 쉽게 구할 수 있다!
map()
이용하기
data = [[6, 8, 2, 6, 2],
[3, 2, 3, 4, 6],
[6, 7, 3, 3, 2],
[7, 2, 5, 3, 6],
[8, 9, 5, 2, 7]]
min_val = min(map(min, data)) # 2
max_val = max(map(max, data)) # 9
이렇게 map()
을 이용하면 1차원 리스트에서 사용했던 것처럼 간편하게 구할 수 있다.
코드를 간단하게 설명해 보면,
map(min, data)
는data
의 각 하위 리스트에min()
을 적용하여 최솟값을 반환한다.- map 객체 형태로 반환하는데, 리스트로 변환하여 출력해 보면
[2, 2, 2, 2, 2]
이다.
- map 객체 형태로 반환하는데, 리스트로 변환하여 출력해 보면
- 이 map 객체에 다시 한번
min()
을 적용하여 해당 리스트의 최솟값인2
를 반환한다.
📌 2차원 리스트에서 최솟값, 최댓값 구하기
- 최솟값:min(map(min, 2차원리스트))
- 최댓값:max(map(max, 2차원리스트))
📢 위의 코드만 사용하면 끝인데, 만약 위의 코드가 이해되지 않는다면 해당 글을 끝까지 읽는 것을 추천드립니다!
min()
, max()
, map()
사실 위의 코드가 단번에 이해가 되지 않아 내장 함수를 자세히 정리해 보았다🥲
min()
iterable에서 가장 작은 항목이나 두 개 이상의 인자 중 가장 작은 것을 돌려준다.
예제
data = [4, 2, 9, 3]
data2 = [1, 5, 4, 2]
data3 = [9, 7, 5, 8]
print(min(data)) # 2
print(min(7, 2)) # 2
print(max(data, data2, data3]) # [1, 5, 4, 2]
max()
iterable에서 가장 큰 항목이나 두 개 이상의 인자 중 가장 큰 것을 돌려준다.
예제
data = [4, 2, 9, 3]
data2 = [1, 5, 4, 2]
data3 = [9, 7, 5, 8]
print(max(data)) # 9
print(max(7, 2)) # 7
print(max(data, data2, data3)) # [9, 7, 5, 8]
map()
iterable을 받아서, 각 요소에 함수를 적용해 주는 함수이다.
map(적용시킬함수, 적용할 요소들))
- 출력 결과는
iterator
이기 때문에 보통list
타입으로 형 변환해서 사용한다.
예제
data = [1, 2, 3, 4]
print(list(map(str, data))) # ['1', '2', '3', '4']
int
형 데이터로 이루어져 있던data
를map
을 이용하여 모두str
형으로 바꿨다.
2차원 리스트에서 최댓값, 최솟값 구하는 방법 (step by step)
이제 내장 함수도 자세히 알아봤으니, 단계별로 코드를 분석해 보자!
data = [[6, 8, 2, 6, 2],
[3, 2, 3, 4, 6],
[6, 7, 3, 3, 2],
[7, 2, 5, 3, 6],
[8, 9, 5, 2, 7]]
min_val = min(map(min, data)) # 2
max_val = max(map(max, data)) # 9
최댓값과 최솟값 중 하나만 이해하면 되므로 최솟값을 기준으로 알아보도록 하겠다.
map(min, data)
min(map(min, data))
에서 map(min, data))
가 어떻게 동작하는지부터 알아보자.
a = list(map(min, data))
print(a) # [2, 2, 2, 2, 2]
map()
은 data
의 각 하위 리스트에 min()
을 적용하여 최솟값을 반환한다.
즉, data[0]
부터 data[4]
까지 하위 리스트의 최솟값들을 반환하는 것을 의미한다.
요소 | 최솟값 | |
data[0] | [6, 8, 2, 6, 2] | 2 |
data[1] | [3, 2, 3, 4, 6] | 2 |
data[2] | [6, 7, 3, 3, 2] | 2 |
data[3] | [7, 2, 5, 3, 6] | 2 |
data[4] | [8, 9, 5, 2, 7] | 2 |
min(map(min, data))
위에서 map()
을 사용한 결과인 [2, 2, 2, 2, 2]
중 최솟값 하나를 추출하기 위해서 다시 min()
을 적용하겠다는 뜻이다.
min_val = min(a) # min(map(min, data))와 동일
print(min_val) # 2
min_val
은 [2, 2, 2, 2, 2]
중 최솟값인 2
가 된다.
📚 Reference
https://devbull.xyz/python-2caweon-baeyeolyi-coedaegabs-coesogabs-cajgi/
https://docs.python.org/ko/3/library/functions.html
https://wikidocs.net/22803
'Language > Python' 카테고리의 다른 글
[Python] 슬라이싱에 대해 알아보자! (0) | 2023.10.12 |
---|---|
[Math] 올림, 내림, 버림, 반올림 함수 (0) | 2023.06.22 |
[String] Python 문자열 메소드 정리 (0) | 2023.06.15 |
[Basic] Python으로 입출력하기 (1) | 2023.06.13 |