Logo

파이썬의 map 내장 함수로 데이터 변환하기

map 내장 함수

파이썬의 내장 함수인 map()는 여러 개의 데이터를 한 번에 다른 형태로 변환하기 위해서 사용됩니다. 따라서, 여러 개의 데이터를 담고 있는 list나 tuple을 대상으로 주로 사용하는 함수입니다.

사용 방법은 매우 간단한데요… 기본 문법은 다음과 같습니다.

map(변환 함수, 순회 가능한 데이터)

map() 함수는 두번째 인자로 넘어온 데이터가 담고 있는 모든 데이터에 변환 함수를 적용하여 다른 형태의 데이터를 반환합니다.

실습 데이터 생성

파이썬 인터프리터에서 다음과 같이 유저 5명의 데이터를 임의로 생성합니다. 5개의 dictionary를 담고 있는 list 입니다.

>>> users = [{'mail': 'gregorythomas@gmail.com', 'name': 'Brett Holland', 'gender': 'M'},
...  {'mail': 'hintoncynthia@hotmail.com', 'name': 'Madison Martinez', 'gender': 'F'},
...  {'mail': 'wwagner@gmail.com', 'name': 'Michael Jenkins', 'gender': 'M'},
...  {'mail': 'daniel79@gmail.com', 'name': 'Karen Rodriguez', 'gender': 'F'},
...  {'mail': 'ujackson@gmail.com', 'name': 'Amber Rhodes', 'gender': 'F'}]

일반 함수로 맵핑

그럼, 실습 데이터를 대상으로 map() 함수를 사용해서 각 유저의 이름과 성을 출력해보도록 하겠습니다.

map() 함수는 함수를 인자로 받기 때문에, convert_to_name()이라는 함수를 먼저 작성합니다.

>>> def convert_to_name(user):
...     first, last = user["name"].split()
...     return {"first": first, "last": last}
...

이제, convert_to_name() 함수를 첫번째 인자로, users list를 두번째 인자로 던져서 map() 함수를 호출합니다.

>>> for name in map(convert_to_name, users):
...     print(name)
...
{'first': 'Brett', 'last': 'Holland'}
{'first': 'Madison', 'last': 'Martinez'}
{'first': 'Michael', 'last': 'Jenkins'}
{'first': 'Karen', 'last': 'Rodriguez'}
{'first': 'Amber', 'last': 'Rhodes'}

모든 유저의 이름(first)과 성(last)이 출력되었습니다!

람다 함수로 필터링

변환 함수의 코드가 긴 경우에는 위와 같이 함수를 선언하는 것이 낫겠지만, 짧은 경우에는 람다 함수를 사용하면 더욱 간단 명료한 코드를 짤 수 있습니다.

예를 들어, 람다 함수를 이용해서 유저의 성별을 한국어로 출력해보겠습니다.

>>> for mail in map(lambda u: "남" if u["gender"] == "M" else "여", users):
...     print(mail)
...
남
여
남
여
여

결과 데이터 변환

지금까지 map() 함수로 변환된 결과를 콘솔에 출력만 했었는데요. 많은 경우, 결과 데이터를 list나 tuple 타입으로 저장을 해야합니다.

여기서, 많은 분들을 혼란스럽게 하는 부분이 있는데요… map() 함수는 map 타입으로 결과를 리턴한다는 점입니다.

예를 들어, 유저 list를 이메일 list로 변환하는 map() 함수의 결과는 다음과 깉이 출력됩니다.

>>> map(lambda u: u["mail"], users)
<map object at 0x1113979a0>

map() 함수의 결과값을 list로 변환하는 가장 쉬운 방법은 list() 내장 함수를 사용하는 것입니다.

>>> list(map(lambda u: u["mail"], users))
['gregorythomas@gmail.com', 'hintoncynthia@hotmail.com', 'wwagner@gmail.com', 'daniel79@gmail.com', 'ujackson@gmail.com']

마찬가지로 tuple() 내장 함수를 사용하면 tuple로 변환할 수 있습니다.

>>> tuple(map(lambda u: u["mail"], users))
('gregorythomas@gmail.com', 'hintoncynthia@hotmail.com', 'wwagner@gmail.com', 'daniel79@gmail.com', 'ujackson@gmail.com')

여러 개의 데이터를 저장하기 위해서 사용되는 list와 tuple의 차이점에 대해서는 관련 포스팅를 참고바라겠습니다.

List Comprehension

사실 파이썬에서는 map() 함수를 사용하는 것보다 더 파이썬답게(pythonic) 데이터를 변환하는 방법이 있습니다. 바로 파이썬의 🌼이라고 불리는 list comprehension을 사용하는 것인데요.

예를 들어, 유저 list를 이메일 list로 변환하는 코드를 list comprehension을 이용해서 재작성 해보면 아래와 같습니다.

>>> [user["mail"] for user in users]
['gregorythomas@gmail.com', 'hintoncynthia@hotmail.com', 'wwagner@gmail.com', 'daniel79@gmail.com', 'ujackson@gmail.com']

list comprehension은 결과값은 역시 list 타입이기 때문에, 별다른 타입 변환이 필요없는 것도 이점이 될 수 있겠습니다. tuple을 얻고 싶다면 마찬가지로 tuple() 내장 함수만 사용해주면 됩니다.

>>> tuple(user["mail"] for user in users)
('gregorythomas@gmail.com', 'hintoncynthia@hotmail.com', 'wwagner@gmail.com', 'daniel79@gmail.com', 'ujackson@gmail.com')

어떤가요? 저는 대부분의 경우에는 list comprehension을 더 선호하는데, list comprehension에 대한 호불호가 워낙 갈리다 보니 여기서 줄이겠습니다. 😅

마치면서

이상으로 여러 개의 데이터를 한 번에 다른 형태로 변환할 때 사용하는 파이썬의 map() 내장 함수에 대해서 알아보았습니다. 이러한 과정을 흔히 데이터 맵핑(data mapping)이라고도 하는데요. 함수형 프로그래밍에서는 매우 자주 사용되는 개념이니 잘 이해하시고 활용하셨으면 좋겠습니다.