⚠️
해당 글 작성 시 완벽히 이해하지 못했던 것 같아 다시 정리해보았습니다🥲
더 자세한 설명을 원하신다면 아래 사이트를 방문하는 것을 추천합니다!
👩🏻💻 2023.06.27 수정 버전 - https://coji.tistory.com/36
📌 hminn님의 댓글을 참고하여 내용을 수정하였습니다.
평소에 리스트에서 최솟값과 최댓값을 구해야할 때 파이썬의 내장 함수인 min()
, max()
함수를 사용하였다.
오늘 알고리즘 문제를 풀던 중 2차원 리스트에서 최솟값과 최댓값을 구해야해서 별 생각없이 min()
, max()
을 사용했는데 내 생각과는 다른 결과가 나왔다.😭
다음과 같이 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)
의도한 결과는
min_val: 2
max_val: 9
였지만 실행 결과는 다음과 같았다.
min_val: [3, 2, 3, 4, 6]
max_val: [8, 9, 5, 2, 7]
알고보니
min()
은 가장 작은 원소, max()
는 가장 큰 원소를 반환한다.min()
은 원소 합이 가장 작은 1차원 리스트, max()
는 원소 합이 가장 큰 1차원 리스트였다.다음 코드를 살펴보자.
data = [[1, 2, 3], [5], [0, 1, 100]]
print(min(data)) # [0, 1, 100]
print(max(data)) # [5]
리스트 원소 합과 원소의 개수와는 상관없이 리스트의 첫 번째 원소부터 대소 비교를 하여 결과값을 낸다는 것을 확인할 수 있다.
그러면 2차원 리스트에서 최솟값 하나, 최댓값 하나를 어떻게 구해야 할까?
물론 for문을 이용하여 이용할 수도 있겠지만, map
을 이용한다면 min
, max
를 이용해 최솟값, 최댓값 하나를 구할 수 있다!
그 방법을 알아보기 전에 min(), max(), map
을 제대로 정리해보자!
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]
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]
iterable을 받아서, 각 요소에 함수를 적용해주는 함수이다.
map(적용시킬함수, 적용할 요소들))
- 출력 결과는
iterator
이기 때문에 보통list
타입으로 형 변환해서 사용한다.
data = [1, 2, 3, 4]
print(list(map(str, data))) # ['1', '2', '3', '4']
int
형 데이터로 이루어져 있던 data
를 map
을 이용하여 모두 str
형으로 바꿨다.
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
과 max
를 이용하여 2차원 리스트의 최솟값과 최댓값을 구할 수 있다.
단계별로 한 번 살펴보자!
a = list(map(min, data))
b = list(map(max, data))
print(a) # [2, 2, 2, 2, 2]
print(b) # [8, 6, 7, 7, 9]
map
을 이용하여
a
에는 data
의 min
값을 추출하여 저장하고.b
에는 data
의 max
값을 추출하여 저장한다.그래서 a
와 b
를 각각 출력하면
a
는 각 줄에서의 최솟값을 추출한 리스트인 [2, 2, 2, 2, 2]
가 출력되고b
는 각 줄에서의 최댓값을 추출한 리스트인 [8, 6, 7, 7, 9]
가 출력된다. min_val = min(a) # min(map(min, data))와 동일하다.
max_val = max(b) # max(map(max, data))와 동일하다.
print(min_val)
print(max_val)
다시 min
과 max
를 이용하여 그 중에서의 min
값과, max
값을 추출하면 된다!
min_val
은 [2, 2, 2, 2, 2]
중 최솟값인 2
가 출력된다.max_val
은 [8, 6, 7, 7, 9]
중 최댓값인 9
가 출력된다.https://devbull.xyz/python-2caweon-baeyeolyi-coedaegabs-coesogabs-cajgi/
https://docs.python.org/ko/3/library/functions.html
https://wikidocs.net/22803
안녕하세요!
"2차원 리스트에서 min()은 원소 합이 가장 작은 1차원 리스트, max()는 원소 합이 가장 큰 1차원 리스트였다"
라고 말씀해주신 부분에 오류가 있어 댓글 남깁니다.
2차원 배열을 대상으로 max, min 함수를 호출했을 때,
'리스트 원소 합이 가장 크거나 혹은 작은' 리스트가 반환된다고 되어있는데
실제로 돌려보면 다른 결과가 나옵니다.
제가 실험해본 결과, '리스트 원소들을 순차적으로 비교' 하여 결과 값을 반환합니다.
다음과 같은 예를 통해 검증할 수 있습니다.
data = [[1, 2, 100], [1, 3, 3], [2, 0, 0]]
max(data) # [2, 0, 0]
min(data) # [1, 2, 100]
위의 예를 통해, max, min의 결과 값은 각 리스트 원소들의 합으로 결정되는 것이 아님을 확인할 수 있고,
각 리스트의 첫번째 원소부터 순차적으로 비교하여 결과 값이 결정됨을 알 수 있습니다.
결론적으로,
2차원 배열에 대한 max, min 함수는
'각 리스트의 첫번째 원소부터 순차적으로 대소 비교를 하여 결과 값을 낸다' 가 맞는 이야기입니다.
그렇기에, 2차원 배열의 각 리스트가 비교 가능한 값들로 이루어지기만 한다면,
max, min, sort 등 대소 비교를 기반으로 결과 값을 산출하는 메서드들이 모두 동작하게 됩니다.
data = [['b', 'a'], ['b', 'c'], ['a', 'b']]
max(data) # ['b', 'c']
min(data) # ['a', 'b']
감사합니다.