Python map() 함수란?
map()은 리스트, 튜플과 같은 반복 가능한 데이터의 각 요소에 동일한 함수를 적용하는 Python 내장 함수입니다. 여러 데이터를 하나씩 꺼내 처리해야 할 때 반복문을 직접 작성하지 않고도 간결하게 변환할 수 있습니다.
예를 들어 숫자 리스트의 모든 값을 두 배로 만들거나, 문자열 리스트를 정수로 변환하거나, 상품 가격에 할인율을 적용하는 작업에 활용할 수 있습니다.
다만 map()은 결과를 리스트로 바로 반환하지 않고 map 객체를 반환합니다. 결과를 확인하려면 보통 list()나 tuple()로 변환해야 합니다.
map() 기본 문법
map()의 기본 문법은 다음과 같습니다.
map(함수, 반복_가능한_객체)
| 구성 요소 | 설명 |
|---|---|
| 함수 | 각 요소에 적용할 함수 |
| 반복 가능한 객체 | 리스트, 튜플, 문자열 등 |
| 반환값 | map 객체 |
가장 간단한 예제로 숫자 리스트의 각 값을 두 배로 만들어 보겠습니다.
numbers = [1, 2, 3, 4, 5] result = map(lambda x: x * 2, numbers) print(result) print(list(result))
실행 결과
<map object at 0x...> [2, 4, 6, 8, 10]
map()의 결과는 바로 리스트가 아니므로 list(result)처럼 변환해야 실제 값을 확인할 수 있습니다.
일반 함수와 map() 함께 사용하기
map()에는 lambda 함수뿐만 아니라 def로 정의한 일반 함수도 전달할 수 있습니다.
def square(number): return number ** 2 numbers = [1, 2, 3, 4, 5] result = map(square, numbers) print(list(result))
실행 결과
[1, 4, 9, 16, 25]
함수 이름을 전달할 때는 괄호를 붙이지 않습니다. map(square(), numbers)가 아니라 map(square, numbers)로 작성해야 합니다.
| 작성 방식 | 의미 | 올바른 사용 |
|---|---|---|
square |
함수 자체를 전달 | 가능 |
square() |
함수를 즉시 실행 | map 인자로 부적절 |
lambda 함수와 map() 사용하기
간단한 변환 작업에서는 별도의 함수를 만들기보다 lambda 함수를 함께 사용하는 경우가 많습니다.
numbers = [10, 20, 30, 40] result = map(lambda number: number + 5, numbers) print(list(result))
실행 결과
[15, 25, 35, 45]
lambda 함수는 다음 형식으로 작성합니다.
lambda 매개변수: 반환할_표현식
다만 lambda 안의 로직이 길어지거나 복잡해진다면 def 함수로 분리하는 편이 읽기 쉽습니다.
문자열을 숫자로 변환하기
실무에서 map()이 자주 사용되는 대표적인 상황은 문자열 숫자 목록을 실제 숫자로 변환하는 작업입니다.
values = ["10", "20", "30", "40"] numbers = list(map(int, values)) print(numbers) print(type(numbers[0]))
실행 결과
[10, 20, 30, 40] <class 'int'>
int도 하나의 함수이므로 map()의 첫 번째 인자로 바로 전달할 수 있습니다.
| 변환 목적 | 작성 예시 | 결과 |
|---|---|---|
| 문자열을 정수로 변환 | map(int, values) |
int 값 |
| 문자열을 실수로 변환 | map(float, values) |
float 값 |
| 숫자를 문자열로 변환 | map(str, numbers) |
str 값 |
input()과 map() 함께 사용하기
알고리즘 문제나 콘솔 프로그램에서는 한 줄에 입력된 여러 숫자를 처리할 때 input(), split(), map()을 함께 사용합니다.
numbers = list(map(int, input("숫자를 입력하세요: ").split())) print(numbers) print(sum(numbers))
입력 예시
10 20 30 40
실행 결과
[10, 20, 30, 40] 100
위 코드는 다음 순서로 동작합니다.
input()으로 한 줄을 문자열로 입력받습니다.split()으로 공백을 기준으로 문자열을 나눕니다.map(int, ...)로 각각을 정수로 변환합니다.list()로 결과를 리스트로 만듭니다.
여러 개의 반복 객체 처리하기
map()에는 하나가 아니라 여러 개의 반복 가능한 객체를 전달할 수도 있습니다. 이 경우 함수도 전달된 객체 수만큼 매개변수를 받아야 합니다.
numbers1 = [1, 2, 3] numbers2 = [10, 20, 30] result = map(lambda x, y: x + y, numbers1, numbers2) print(list(result))
실행 결과
[11, 22, 33]
각 리스트에서 같은 위치의 요소를 하나씩 꺼내 함수에 전달합니다.
prices = [10000, 20000, 30000] discounts = [0.1, 0.2, 0.15] discounted_prices = map( lambda price, rate: int(price * (1 - rate)), prices, discounts ) print(list(discounted_prices))
실행 결과
[9000, 16000, 25500]
주의할 점은 길이가 다른 객체를 전달하면 가장 짧은 객체를 기준으로 처리가 종료된다는 것입니다.
first = [1, 2, 3, 4] second = [10, 20] result = map(lambda x, y: x + y, first, second) print(list(result))
실행 결과
[11, 22]
map 객체의 특징
Python 3에서 map()은 필요한 값을 한 번에 모두 생성하지 않고, 실제로 값이 필요할 때 하나씩 계산하는 지연 평가 방식을 사용합니다.
| 특징 | 설명 |
|---|---|
| 반환 형식 | map 객체 |
| 계산 시점 | 값이 필요한 시점 |
| 메모리 사용 | 큰 데이터를 처리할 때 유리할 수 있음 |
| 재사용 | 한 번 소비하면 다시 사용할 수 없음 |
numbers = [1, 2, 3] result = map(lambda x: x * 10, numbers) print(list(result)) print(list(result))
실행 결과
[10, 20, 30] []
첫 번째 list(result)에서 map 객체의 모든 요소를 소비했기 때문에 두 번째 결과는 빈 리스트가 됩니다.
결과를 여러 번 사용해야 한다면 처음부터 리스트로 변환해 변수에 저장하는 것이 안전합니다.
numbers = [1, 2, 3] result = list(map(lambda x: x * 10, numbers)) print(result) print(result)
실행 결과
[10, 20, 30] [10, 20, 30]
map()과 리스트 컴프리헨션 비교
map()과 리스트 컴프리헨션은 모두 반복 데이터의 각 요소를 변환할 수 있습니다.
numbers = [1, 2, 3, 4] # map 사용 result1 = list(map(lambda x: x * 2, numbers)) # 리스트 컴프리헨션 사용 result2 = [x * 2 for x in numbers] print(result1) print(result2)
실행 결과
[2, 4, 6, 8] [2, 4, 6, 8]
| 항목 | map() | 리스트 컴프리헨션 |
|---|---|---|
| 코드 형태 | 함수를 인자로 전달 | 표현식을 직접 작성 |
| 반환값 | map 객체 | 리스트 |
| 기존 함수 활용 | 편리함 | 상대적으로 장황할 수 있음 |
| 단순 표현식 | lambda가 필요할 수 있음 | 읽기 쉬운 경우가 많음 |
| 대용량 처리 | 지연 평가 가능 | 리스트를 즉시 생성 |
이미 정의된 함수를 각 요소에 적용할 때는 map()이 자연스럽습니다. 반면 간단한 연산을 직접 표현할 때는 리스트 컴프리헨션이 더 읽기 쉬운 경우가 많습니다.
map()과 filter()의 차이
map()과 filter()는 함께 자주 언급되지만 역할은 다릅니다.
| 함수 | 목적 | 예시 |
|---|---|---|
| map() | 모든 요소를 변환 | 각 숫자를 두 배로 변경 |
| filter() | 조건에 맞는 요소만 선택 | 짝수만 추출 |
numbers = [1, 2, 3, 4, 5] mapped = list(map(lambda x: x * 2, numbers)) filtered = list(filter(lambda x: x % 2 == 0, numbers)) print(mapped) print(filtered)
실행 결과
[2, 4, 6, 8, 10] [2, 4]
map()은 원칙적으로 각 입력 요소에 대해 하나의 결과를 만듭니다. filter()는 조건에 따라 일부 요소를 제외합니다.
조건식을 map()에 적용하기
lambda의 조건 표현식을 활용하면 각 요소를 조건에 따라 다른 값으로 변환할 수 있습니다.
scores = [45, 80, 67, 30, 95] results = list( map(lambda score: "합격" if score >= 60 else "불합격", scores) ) print(results)
실행 결과
['불합격', '합격', '합격', '불합격', '합격']
조건이 복잡해지면 lambda 안에 모두 작성하지 말고 일반 함수로 분리하는 것이 좋습니다.
def classify_score(score): if score >= 90: return "A" if score >= 80: return "B" if score >= 70: return "C" return "D" scores = [95, 82, 73, 60] grades = list(map(classify_score, scores)) print(grades)
실행 결과
['A', 'B', 'C', 'D']
딕셔너리 리스트 변환하기
실제 프로젝트에서는 딕셔너리로 구성된 데이터를 가공할 때 map()을 활용할 수 있습니다.
products = [ {"name": "키보드", "price": 50000}, {"name": "마우스", "price": 30000}, {"name": "모니터", "price": 250000} ] names = list(map(lambda product: product["name"], products)) print(names)
실행 결과
['키보드', '마우스', '모니터']
상품 가격에 부가세를 포함한 새 딕셔너리를 만들 수도 있습니다.
products = [ {"name": "키보드", "price": 50000}, {"name": "마우스", "price": 30000} ] result = list( map( lambda product: { "name": product["name"], "price": product["price"], "price_with_tax": int(product["price"] * 1.1) }, products ) ) print(result)
실행 결과
[ {'name': '키보드', 'price': 50000, 'price_with_tax': 55000}, {'name': '마우스', 'price': 30000, 'price_with_tax': 33000} ]
문자열 데이터 정리하기
사용자 이름이나 CSV 데이터처럼 불필요한 공백과 대소문자가 섞인 문자열을 정리할 때도 유용합니다.
names = [" KIM ", " lee", "PARK "] cleaned_names = list( map(lambda name: name.strip().title(), names) ) print(cleaned_names)
실행 결과
['Kim', 'Lee', 'Park']
다만 문자열 메서드 하나만 적용할 때는 lambda 없이 메서드 자체를 전달할 수도 있습니다.
words = ["python", "java", "javascript"] result = list(map(str.upper, words)) print(result)
실행 결과
['PYTHON', 'JAVA', 'JAVASCRIPT']
실무 활용 예제: 상품 가격 할인 처리
쇼핑몰 상품 목록에 할인율을 적용하는 예제를 살펴보겠습니다.
products = [ {"name": "노트북", "price": 1200000}, {"name": "키보드", "price": 80000}, {"name": "마우스", "price": 50000} ] discount_rate = 0.1 def apply_discount(product): discounted_price = int(product["price"] * (1 - discount_rate)) return { "name": product["name"], "original_price": product["price"], "discounted_price": discounted_price } discounted_products = list(map(apply_discount, products)) for product in discounted_products: print(product)
실행 결과
{'name': '노트북', 'original_price': 1200000, 'discounted_price': 1080000} {'name': '키보드', 'original_price': 80000, 'discounted_price': 72000} {'name': '마우스', 'original_price': 50000, 'discounted_price': 45000}
실무에서는 원본 데이터를 직접 수정하기보다 새로운 데이터를 반환하도록 작성하면 부작용을 줄이고 테스트하기 쉬워집니다.
map() 사용 중 발생하는 대표적인 오류
함수 호출 결과를 전달하는 실수
def double(number): return number * 2 numbers = [1, 2, 3] # 잘못된 코드 result = map(double(), numbers)
double()은 인자가 필요하므로 오류가 발생합니다. 함수 자체를 전달해야 합니다.
result = map(double, numbers) print(list(result))
실행 결과
[2, 4, 6]
문자열 숫자에 소수점이 포함된 경우
values = ["10", "20.5", "30"] result = list(map(int, values))
int("20.5")는 바로 변환할 수 없으므로 ValueError가 발생합니다.
values = ["10", "20.5", "30"] result = list(map(lambda value: int(float(value)), values)) print(result)
실행 결과
[10, 20, 30]
None 값이 포함된 경우
values = ["10", None, "30"] result = list(map(int, values))
int(None)은 허용되지 않으므로 사전에 처리해야 합니다.
values = ["10", None, "30"] result = list( map(lambda value: int(value) if value is not None else 0, values) ) print(result)
실행 결과
[10, 0, 30]
초보자가 자주 하는 실수
map()이 리스트를 반환한다고 생각하는 경우- 함수 이름 대신 함수 실행 결과를 전달하는 경우
- map 객체를 한 번 소비한 뒤 다시 사용하려는 경우
- 길이가 다른 여러 리스트를 전달해도 모든 요소가 처리된다고 생각하는 경우
- 복잡한 lambda를 작성해 코드의 가독성을 떨어뜨리는 경우
- 문자열을 숫자로 변환할 때 잘못된 형식으로 인해 발생하는 오류를 처리하지 않는 경우
map() 사용 시 권장 방법
- 기존 함수를 여러 요소에 적용할 때
map()을 활용합니다. - 결과를 여러 번 사용할 예정이라면 즉시 리스트로 변환합니다.
- 간단한 변환은 lambda를 사용하되 복잡한 로직은 일반 함수로 분리합니다.
- 단순한 표현식은 리스트 컴프리헨션과 비교해 더 읽기 쉬운 방식을 선택합니다.
- 외부 데이터는 변환 전에
None, 빈 문자열, 잘못된 숫자 형식을 확인합니다. - 함수 안에서 원본 객체를 직접 수정하기보다 새로운 객체를 반환하는 방식을 고려합니다.
실무 팁: 짧다는 이유만으로 무조건 map과 lambda를 조합하지 마세요. 팀원이 코드를 한 번에 이해할 수 있는지가 더 중요합니다.
VS Code에서 map() 예제 실행하기
VS Code에서 간단한 Python 파일을 만들어 map 예제를 실행할 수 있습니다.
- VS Code에서
map_example.py파일을 만듭니다. - Python 확장 프로그램과 인터프리터가 선택되어 있는지 확인합니다.
- 아래 코드를 입력합니다.
- 터미널에서
python map_example.py를 실행합니다.
def normalize_name(name): return name.strip().title() users = [" kim", "LEE ", " park "] normalized_users = list(map(normalize_name, users)) print(normalized_users)
실행 결과
['Kim', 'Lee', 'Park']
GitHub 협업 시 주의할 점
map을 사용하는 코드도 다른 Python 코드와 마찬가지로 가독성과 테스트 가능성을 고려해야 합니다.
- 복잡한 lambda는 이름이 있는 함수로 분리합니다.
- 변환 함수에 부작용이 없도록 작성합니다.
- 입력 데이터에 빈 값이나 잘못된 값이 포함된 경우를 테스트합니다.
- 팀의 코드 스타일에 따라 map 또는 리스트 컴프리헨션 사용 기준을 통일합니다.
- 함수의 입력값과 반환값에 타입 힌트를 추가하면 유지보수가 쉬워집니다.
from typing import Iterable def double_numbers(numbers: Iterable[int]) -> list[int]: return list(map(lambda number: number * 2, numbers)) print(double_numbers([1, 2, 3]))
실행 결과
[2, 4, 6]
map() 핵심 정리
| 항목 | 핵심 내용 |
|---|---|
| 기본 문법 | map(함수, 반복 객체) |
| 반환값 | map 객체 |
| 리스트 변환 | list(map(...)) |
| 대표 활용 | 형 변환, 데이터 가공, 문자열 정리 |
| 여러 객체 | 같은 위치의 요소를 함수에 전달 |
| 주의사항 | 한 번 소비한 map 객체는 재사용 불가 |
| 대안 | 리스트 컴프리헨션 |
마무리
Python map()은 반복 가능한 데이터의 각 요소에 동일한 함수를 적용할 때 사용하는 내장 함수입니다. 숫자 계산, 문자열 정리, 자료형 변환, 딕셔너리 가공 등 다양한 작업을 반복문 없이 표현할 수 있습니다.
다만 단순히 코드를 짧게 만들기 위해 사용하는 것보다, 함수 전달 방식이 자연스럽고 코드의 의미가 명확할 때 사용하는 것이 좋습니다. 간단한 표현식은 리스트 컴프리헨션이 더 읽기 쉬울 수 있으며, 복잡한 변환은 이름이 있는 일반 함수로 분리하는 것이 유지보수에 유리합니다.
map()의 반환값이 map 객체라는 점과 한 번 소비하면 다시 사용할 수 없다는 특징까지 이해하면 실무에서도 안전하게 활용할 수 있습니다.
FAQ
Q1. Python map()은 리스트를 반환하나요?
아니요. Python 3의 map()은 map 객체를 반환합니다. 리스트가 필요하면 list(map(...)) 형태로 변환해야 합니다.
Q2. map()과 for문의 차이는 무엇인가요?
두 방식 모두 반복 데이터의 각 요소를 처리할 수 있습니다. map()은 함수를 각 요소에 적용하는 목적이 명확하고, for문은 조건문이나 여러 단계의 로직을 포함하기 쉽습니다.
Q3. map()과 리스트 컴프리헨션 중 무엇이 더 좋은가요?
기존 함수를 그대로 적용할 때는 map()이 편리합니다. 단순한 표현식을 작성할 때는 리스트 컴프리헨션이 더 읽기 쉬운 경우가 많습니다.
Q4. map()에 여러 리스트를 전달할 수 있나요?
네. 여러 반복 객체를 전달할 수 있습니다. 함수는 전달된 객체 수만큼 매개변수를 받아야 하며, 가장 짧은 반복 객체가 끝나면 처리도 종료됩니다.
Q5. map 객체를 두 번 사용할 수 있나요?
일반적으로 한 번 모두 소비한 map 객체는 다시 사용할 수 없습니다. 여러 번 사용하려면 처음부터 리스트나 튜플로 변환해 저장해야 합니다.
Q6. map() 안에서 조건문을 사용할 수 있나요?
네. lambda 조건 표현식이나 일반 함수를 사용할 수 있습니다. 다만 조건이 복잡하면 일반 함수로 분리하는 것이 좋습니다.
Q7. map()으로 문자열을 정수로 변환할 수 있나요?
네. list(map(int, ["10", "20", "30"]))처럼 작성하면 문자열 숫자를 정수 리스트로 변환할 수 있습니다.
함께 읽으면 좋은 글
'python' 카테고리의 다른 글
| Python zip() 사용법 (0) | 2026.07.27 |
|---|---|
| Python filter() 사용법 (1) | 2026.07.22 |
| Python lambda 함수 (0) | 2026.07.20 |
| Python 자료형 변환(int, float, str) (0) | 2026.07.12 |
| Python None 완벽 이해하기 (0) | 2026.07.12 |