[Python] 2차원 리스트의 최솟값, 최댓값 구하기

16774 단어 minmaxMappythonMap

평소에 리스트에서 최솟값과 최댓값을 구해야할 때 파이썬의 내장 함수인 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]

알고보니

  • 1차원 리스트에서 min()은 가장 작은 원소, max()는 가장 큰 원소이지만,
  • 2차원 리스트에서 min()은 원소 합이 가장 작은 1차원 리스트, max()는 원소 합이 가장 큰 1차원 리스트였다.

그래서 2차원 리스트인 datamin()max()가 각각 원소합이 18인 리스트인 [3, 2, 3, 4, 6], 원소합이 31인 [8, 9, 5, 2, 7]이 되는 것이다.

그러면 2차원 리스트에서 최솟값 하나, 최댓값 하나를 어떻게 구해야 할까?
물론 for문을 이용하여 이용할 수도 있겠지만, map을 이용한다면 min, max를 이용해 최솟값, 최댓값 하나를 구할 수 있다!

그 방법을 알아보기 전에 min(), max(), map을 제대로 정리해보자!


[ min(), max(), map() ]

1. 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]

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]

3. map()

iterable을 받아서, 각 요소에 함수를 적용해주는 함수이다.

map(적용시킬함수, 적용할 요소들))
  • 출력 결과는 iterator이기 때문에 보통 list 타입으로 형변환해서 사용한다.

예제

data = [1, 2, 3, 4]

print(list(map(str, data)))	# ['1', '2', '3', '4']

int형 데이터로 이루어져 있던 datamap을 이용하여 모두 str형으로 바꿨다.


[ 2차원 리스트 최솟값, 최댓값 구하기 ]

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

위와 같이 max를 이용하면 minmax를 이용하여 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에는 datamin 값을 추출하여 저장하고.
  • b에는 datamax 값을 추출하여 저장한다.

그래서 ab를 각각 출력하면

  • 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)

다시 minmax를 이용하여 그 중에서의 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

좋은 웹페이지 즐겨찾기