Logo

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

함수형 프로그래밍에서 데이터 맵핑(mapping) 작업을 할 때 반복문 대신에 함수 호출로 처리하는 경우가 많은데요. 이번 포스팅에서는 파이썬의 map() 함수를 사용하여 여러 데이터를 한 번에 변환하는 방법에 대해서 알아보겠습니다.

map 내장 함수

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

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

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

map() 함수는 첫번째 인자로 넘어온 변환 함수를 두번째 인자로 넘어온 모든 데이터를 상대로 적용해줍니다.

실습 데이터 생성

간단한 실습을 위해서 파이썬 인터프리터에서 사용자 5명의 데이터를 사전(dictionary)의 형태로 생성 한 후에 리스트에 담아서 users 변수에 할당하겠습니다.

>>> 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() 함수는 함수를 인자로 받기 때문에, split_name()이라는 함수를 먼저 작성합니다.

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

이제, split_name() 함수를 첫번째 인수로, users 리스트를 두번째 인수로 넘겨서 map() 함수를 호출합니다.

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

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

람다 함수로 맵핑

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

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

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

결과 데이터 변환

지금까지 map() 함수로 변환된 결과를 콘솔에 출력만 했었는데요. 그런데 실제로 코딩을 하다보면 결과 데이터를 리스트나 튜플의 형태로 저장을 해야하는 경우가 많습니다.

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

예를 들어, 사용자 리스트를 이메일 리스트로 변환하는 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']

파이썬에서 가장 널리 사용되는 자료형인 리스트(list)에 대해서는 관련 포스팅을 참고바랍니다.

비슷한 방식으로 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 comprehension을 이용해서 재작성 해보면 아래와 같습니다.

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

list comprehension은 결과값은 역시 리스트 타입이기 때문에, 별다른 타입 변환이 필요없는 것도 이점이 될 수 있겠습니다. 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에 대한 호불호가 워낙 갈리다 보니 여기서 줄이겠습니다. 😅

전체 코드

본 포스팅에서 제가 작성한 전체 코드는 아래에서 직접 확인하고 실행해보실 수 있습니다.

https://dales.link/6go

마치면서

이상으로 여러 개의 데이터를 한 번에 다른 형태로 변환할 때 사용하는 파이썬의 map() 내장 함수에 대해서 알아보았습니다. 이 유용한 함수가 불필요한 루프를 피하시고 읽고 쉬운 파이썬 코드를 짜시는데 도움이 되었으면 좋겠습니다.