Programming/python

python , map 함수로 파이썬 한 줄 코드 장인 되기!

방황하는 데이터불도저 2023. 2. 12. 17:36

파이썬의 내장함수 map

 -  [리스트]나 (튜플) 자료구조의 값들에 반복적인 연산을 해주어야 할 때, 자주 쓰이는 아주 간편한 함수입니다.
- 기본 문법은 map(function, iterable)으로 function자리에 반복적으로 계산해주고자 하는 함수가 들어가고, iterable에는 리스트나 튜플 형태의 반복 가능한 자료형이 나오게됩니다.

 
예시로 아래의 문제를 풀어보겠습니다.
 (프로그래머스 스쿨 > 코딩테스트 입문 > 연습문제 "369 게임")

369라는 숫자가 나오는 횟수를 정답으로 리턴하면 되는 문제입니다.
 
여기에서 저는 아래와 같이 for구문을 이용해서 값을 구해주었습니다.
각 수를 탐색하며, 3,6,9 중에 해당되는 문자가 나올때마다 횟수를 더해주는 방식이죠.

def solution(order):
    answer = 0
    for s in str(order):
        if s == '3' or s=='6' or s=='9':
            answer+=1
    return answer

 
하지만 다른사람의 풀이를 봅시다.
 
count라는 내장함수와 map이라는 내장함수가 만나서 코드가 한줄, 한줄씩 줄어드는 것을 보실 수 있습니다.
(count라는 내장함수는 문자열이나 리스트에 있는 값의 횟수를 세어주는 함수로 string.count('a'),   list.count(1) 이런식으로 사용될 수 있습니다.)

# count 함수만 사용한 경우
def solution(order):
    answer = 0
    order = str(order)
    return order.count('3') + order.count('6') + order.count('9')
    

# count, map 함수를 사용한 경우
def solution(order):
    return sum(map(lambda x: str(order).count(x), ['3', '6', '9']))

 
이 count라는 함수를 3,6,9라는 값에 대해서 중복으로 여러번 사용해야하기 때문에, 저렇게 반복되는 코드를 줄여주기 위해서 map을 사용할 수 있습니다.
 - map(lambda x: str(order).count(x), ['3', '6', '9']))
    : lambda를 사용하여 order(숫자형)을 str(order)로 바꾸고,
      그 문자열에서 x = ['3', '6', '9'] 에 대한 count를 하나씩 계산해달라.
 
여기에서 주의할 점은 map으로 연산을 해준 다음 리턴되는 값을 어디에 어떻게 담아줄 것인지 설정해줘야한다는 것입니다. 예를 들어, 아래와 같이 그냥 map 함수로만 끝내면 error가 발생하는 것을 볼 수 있습니다.

a = map(str, range(10))

# Error 발생
  File "<stdin>", line 1
    a = map(str, range(10))
IndentationError: unexpected indent

따라서, 결과값에 적합한 함수로 한번 더 처리해주는 것을 잊지 말아야 합니다.

a = list(map(str, range(10)))

# Output
a
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

결과값에 대해서 list, tuple 등으로 묶어줄 수도 있고, 결과값이 숫자라면 sum, np.average 등의 함수로 연산을 마무리 해줄 수도 있습니다.
 
이렇게 네줄짜리 코딩을 한줄짜리로 만들어보았는데, 사실 속도는 네줄이 더 빠른것같기도합니다!
그래도 큰 차이는 없으니 더 깨끗한 코드가 좋을 수 있겠죠?

for 구문 사용&nbsp; &nbsp; &lt;--------------------------------&gt;&nbsp; &nbsp;map 함수 사용&nbsp; &nbsp; &nbsp;