파이썬의 map() 함수는 리스트나 집합 같은 컬렉션에 포함된 각 항목에 지정한 함수를 실행해 주는 내장 함수입니다. map() 함수는 실행할 함수와 그 함수를 적용할 대상 객체를 인자로 받습니다.
파이썬에서 리스트를 다루다 보면 목록의 모든 항목에 특정 작업을 수행하고 싶은 순간이 자주 찾아옵니다. 예를 들어 문자열 목록을 모두 대문자로 바꾸거나, 숫자 목록 전체에 어떤 연산을 적용하는 경우가 대표적입니다.
바로 이럴 때 파이썬 내장 함수인 map()이 유용하게 사용됩니다. map() 함수는 리스트처럼 반복 가능한(iterable) 객체의 모든 요소에 함수를 일괄 적용하고, 그 결과를 map 객체로 반환합니다.
이 글에서는 다양한 예제를 통해 파이썬 map() 함수의 사용법을 단계별로 살펴보겠습니다.
파이썬 이터러블(Iterable) 객체란?
이터러블 객체는 셀 수 있는 개수의 값을 담고 있으며, 순회(traverse)가 가능한 객체를 말합니다. 파이썬에서는 리스트, 딕셔너리, 튜플, 집합(set)이 모두 여러 값을 저장하고 하나씩 순회할 수 있기 때문에 이터러블 객체에 해당합니다.
예를 들어 학생 이름 목록을 저장해야 한다고 가정해 보겠습니다. 이름마다 별도의 변수를 만드는 대신, 하나의 리스트에 모든 값을 담는 것이 훨씬 효율적입니다.
students = ["Lucy", "Bill", "Graham", "Tommy", "Leslie"]
위 코드의 students 변수에는 리스트가 저장되어 있습니다. 리스트는 이터러블 객체이므로, 우리는 이 목록의 각 항목을 순서대로 접근하며 처리할 수 있습니다.
파이썬 map() 함수 문법
map() 함수는 리스트의 각 요소를 하나씩 전달받아 지정된 함수를 실행합니다. map()은 파이썬에 기본으로 내장되어 있기 때문에 별도의 라이브러리를 import하지 않고도 바로 사용할 수 있다는 장점이 있습니다.
파이썬 map()은 고차 함수(higher-order function)로, 이터러블 객체의 여러 요소에 특정 함수를 한 번에 적용할 수 있습니다. 기본 문법은 다음과 같습니다.
map(function, iterable)
첫 번째 인자인 function은 이터러블의 모든 항목에 대해 실행될 함수입니다. 두 번째 인자인 iterable은 함수가 적용될 대상 객체로, 리스트, 튜플, 딕셔너리, 집합 등이 될 수 있습니다.
파이썬 map() 함수 사용 방법
학교 관리자로서 전체 학생 명단을 작성하는 업무를 맡았다고 가정해 보겠습니다.
학생 이름 옆에 학년을 함께 표시한 명단을 출력하기로 했습니다. 서로 다른 학년에 같은 이름을 가진 학생이 있을 때 혼동을 막기 위해서입니다.
이것은 map() 함수가 빛을 발하는 대표적인 상황입니다. 함수를 적용할 이터러블 객체가 있고, 그 함수는 학생의 이름과 학년을 하나로 합치는 역할을 하면 됩니다. 다음은 학생 이름과 학년을 병합하는 프로그램 예제입니다.
def mergeNamesAndGrades(name): return name + " First Grade" students = ["Lucy", "Bill", "Graham", "Tommy", "Leslie"] student_roster = map(mergeNamesAndGrades, students)
먼저 두 줄에서는 mergeNamesAndGrades라는 함수를 선언했습니다. 이 함수는 각 학생의 이름 뒤에 'First Grade'라는 문자열을 붙여 반환합니다.
그다음 줄에서는 학교 학생 다섯 명의 이름이 담긴 리스트를 정의했습니다.
마지막으로 map() 함수를 호출하여 그 결과를 student_roster 변수에 저장했습니다. map() 함수는 두 개의 인자, 즉 적용할 함수(mergeNamesAndGrades)와 이터러블 객체(students)를 받습니다.
이렇게 하면 mergeNamesAndGrades() 함수가 리스트의 모든 학생 이름에 차례대로 적용됩니다.
map 객체를 리스트로 변환하기
그런데 아직 프로그램이 완성된 것은 아닙니다. map() 함수는 완성된 리스트가 아니라 map 객체를 반환하기 때문입니다. 지금 바로 student_roster 변수를 출력하면 다음과 같은 결과가 나타납니다.
<map object at 0x7f2c74103890>
이런 출력이 나오는 이유는 map() 함수가 리스트가 아닌 자체적인 map 객체를 반환하기 때문입니다. 따라서 학생 이름 목록을 제대로 확인하려면 student_roster 변수를 리스트로 변환해야 합니다. 변환에 사용하는 코드는 다음과 같습니다.
print(list(student_roster))
위 코드를 실행하면 다음과 같은 파이썬 리스트가 출력됩니다.
['Lucy First Grade', 'Bill First Grade', 'Graham First Grade', 'Tommy First Grade', 'Leslie First Grade']
이번에는 조금 다른 예제를 살펴보겠습니다. 학생 명단의 이름과 학년을 모두 대문자로 변환하고 싶다면 어떻게 해야 할까요? 다음 코드를 사용하면 됩니다.
def changeCase(name): return name.upper() student_roster = ['Lucy First Grade', 'Bill First Grade', 'Graham First Grade', 'Tommy First Grade', 'Leslie First Grade'] final_student_roster = map(changeCase, student_roster) print(list(final_student_roster))
실행 결과는 순회 가능한 리스트 형태로 반환됩니다.
['LUCY FIRST GRADE', 'BILL FIRST GRADE', 'GRAHAM FIRST GRADE', 'TOMMY FIRST GRADE', 'LESLIE FIRST GRADE']
이 예제에서는 changeCase라는 함수를 정의했습니다. 이 함수는 파이썬의 upper() 메서드를 사용해 각 이름을 대문자로 변환합니다.
그런 다음 프로그램은 map() 함수를 통해 이터러블 객체인 student_roster의 모든 요소에 changeCase()를 호출했고, 마지막으로 대문자로 변환된 학생 이름 리스트를 반환했습니다.
map() 함수와 lambda 함께 사용하기
파이썬 map() 함수는 lambda 함수와 함께 사용하면 코드를 더욱 간결하고 효율적으로 만들 수 있습니다. 앞선 예제에서는 이터러블을 원하는 형태로 변경하기 위해 새로운 함수를 매번 선언했습니다.
하지만 이터러블 객체에 어떤 동작을 딱 한 번만 적용할 계획이라면 굳이 새 함수를 선언할 필요가 없습니다. 이럴 때 작고 이름 없는 익명 함수인 람다(lambda) 함수를 활용하면 됩니다.
람다 함수는 별도로 정의하기 번거로운 간단한 로직에 map()과 함께 사용하기에 적합합니다. 일반 함수보다 훨씬 간결하기 때문에, 단순한 연산에는 람다 함수를 사용하는 것이 코드의 가독성을 높이는 데도 도움이 됩니다.
앞서 살펴본 예제를 람다 함수로 다시 작성하면 다음과 같습니다.
student_roster = ['Lucy First Grade', 'Bill First Grade', 'Graham First Grade', 'Tommy First Grade', 'Leslie First Grade'] final_student_roster = map(lambda s: s.upper(), student_roster) print(list(final_student_roster))
이번에는 학생 이름을 대문자로 바꾸기 위한 새로운 함수를 선언하지 않았습니다. 대신 lambda s: s.upper()라는 작은 익명 함수를 사용해 각 이름의 대소문자를 변환했습니다.
실행 결과는 다음과 같습니다.
['LUCY FIRST GRADE', 'BILL FIRST GRADE', 'GRAHAM FIRST GRADE', 'TOMMY FIRST GRADE', 'LESLIE FIRST GRADE']
마무리
파이썬 map() 함수는 이터러블 객체의 모든 요소에 특정 함수를 일괄 적용할 때 사용합니다. 예를 들어 문자열 리스트를 모두 대문자로 변환하거나, 숫자 리스트 전체에 특정 값을 곱하는 작업에 활용할 수 있습니다.
이 글에서는 map() 함수를 사용해 이터러블의 모든 요소에 함수를 적용하는 방법을 배웠고, 더 나아가 람다 함수와 조합해 더 간결한 코드를 작성하는 방법도 살펴보았습니다.
이제 여러분도 map() 함수를 능숙하게 활용할 준비가 되었습니다. 직접 다양한 예제를 작성해 보며 감각을 익혀 보세요.