매일 업데이트
2022-08-25 05:39 14 min

Python map() 함수, 예제와 함께 설명

이 튜토리얼에서는 파이썬의 map() 함수를 활용하여 반복 가능한 객체의 모든 요소에 함수를 적용하는 방법을 알아볼 것입니다.

파이썬은 함수형 프로그래밍 패러다임을 지향하며, 이를 통해 함수를 사용하여 작업을 정의하고 계산을 수행할 수 있습니다. 파이썬에서 함수는 객체로 취급될 수 있으며, 다른 함수를 매개변수로 사용하거나 반환할 수도 있습니다.

map() 함수는 함수를 인수로 받아 반복 가능한 객체의 각 요소에 해당 함수를 적용하는 데 유용하게 사용됩니다.

본 튜토리얼을 마치면 파이썬의 map() 함수를 사용하여 반복문과 리스트 컴프리헨션을 보다 간결하게 작성할 수 있게 될 것입니다. 다양한 예시 코드를 통해 map() 함수를 어떻게 활용할 수 있는지 살펴보겠습니다.

파이썬 리스트의 요소에 함수를 적용하는 방법

예시를 통해 자세히 살펴보겠습니다. 👩‍🏫

다음과 같이 숫자 리스트 nums가 있다고 가정해 보겠습니다.

nums = [2,4,3,7]

그리고 숫자를 인수로 받아 해당 숫자의 거듭제곱 (n**n) 값을 반환하는 함수 self_pow()가 있다고 가정합니다. 파이썬에서 ** 연산자는 지수 연산자입니다. 즉, a**b는 a의 b 제곱을 계산합니다.

def self_pow(n):
    return n**n

우리의 목표는 리스트 nums의 모든 요소에 self_pow() 함수를 적용하여 새로운 리스트 nums_pow를 생성하는 것입니다.

for 루프 사용

가장 기본적인 방법은 for 루프를 사용하는 것입니다.

  • nums 리스트의 각 숫자에 대해, num을 인수로 하여 self_pow() 함수를 호출합니다.
  • 함수 호출 결과를 새 리스트 nums_pow에 추가합니다.
nums_pow = []

for num in nums:
    nums_pow.append(self_pow(num))

print(nums_pow)

실행 결과, nums 리스트의 각 숫자는 자기 자신의 거듭제곱으로 계산되어 nums_pow 리스트에 저장됩니다. 즉, nums_pow의 요소는 22, 44, 33, 77입니다.

Output
[4, 256, 27, 823543]

리스트 컴프리헨션 사용

리스트 컴프리헨션을 사용하면 위의 코드를 더 간결하게 만들 수 있습니다. 이전의 for 루프에서 출력 표현식과 반복되는 리스트를 파악할 수 있습니다.

일반적인 리스트 컴프리헨션 표현식은 다음과 같습니다.

new_list = [<출력 표현식> for 항목 in 반복가능한_객체]

nums_pow 리스트를 생성하기 위한 리스트 컴프리헨션 표현식은 다음과 같습니다.

nums_pow = [self_pow(num) for num in nums]
print(nums_pow)

결과는 for 루프를 사용했을 때와 동일합니다.

Output
[4, 256, 27, 823543]

루프나 리스트 컴프리헨션 대신 파이썬의 map() 함수를 사용하면, 더욱 간결한 문법으로 반복 가능한 객체의 모든 항목에 함수를 적용할 수 있습니다. 이제 map() 함수의 구문을 자세히 알아보겠습니다.

파이썬 map() 함수 구문

map() 함수의 일반적인 구문은 다음과 같습니다.

map(함수, 반복가능한_객체1, [반복가능한_객체2,..., 반복가능한_객체n])

map() 함수는 최소 두 개의 인수(함수와 반복 가능한 객체)를 받습니다.

위 구문에서:

  • function은 파이썬 함수 또는 호출 가능한 객체를 나타냅니다. 여기에는 사용자 정의 함수, 내장 함수, 클래스, 인스턴스, 클래스 메서드 등이 포함됩니다.
  • iterable은 리스트, 튜플, 문자열과 같은 유효한 파이썬 반복 가능한 객체입니다.
  • map() 함수는 이러한 반복 가능한 객체의 모든 요소에 적용됩니다.

map() 함수는 무엇을 반환할까요?

map() 함수는 맵 객체를 반환합니다. 이 맵 객체를 리스트로 변환하려면 list(map(함수, 반복가능한_객체)) 구문을 사용할 수 있습니다. 필요에 따라 튜플로 변환할 수도 있습니다.

이제 map() 함수의 구문을 배웠으므로 예제 코드를 통해 실습해 보겠습니다.

이 튜토리얼을 따라 하기 위해서는 파이썬 3.x 버전이 필요합니다. 만약 파이썬이 설치되어 있지 않다면, 온라인 파이썬 편집기를 사용하여 코드를 실행할 수 있습니다.

사용자 정의 함수와 함께 map() 함수를 사용하는 방법

#1. 이전 예시에서 리스트 nums의 모든 숫자에 self_pow() 함수를 적용했습니다. map() 함수를 사용하여 self_pow 함수와 리스트 nums를 인수로 전달할 수 있습니다.

주의: 함수를 호출하는 것이 아니라 함수의 이름만 지정해야 합니다. 즉, self_pow()가 아닌 self_pow를 사용해야 합니다.

map() 함수는 맵 객체를 반환합니다.

print(map(self_pow,nums))

<map object at 0x7f7d315c14d0>

다음과 같이 list() 함수를 사용하여 맵 객체를 리스트로 변환할 수 있습니다.

nums_pow = list(map(self_pow,nums))
print(nums_pow)

결과 출력에서 nums 리스트의 각 숫자 numnums_pow 리스트의 numnum에 매핑된 것을 확인할 수 있습니다.

Output
[4, 256, 27, 823543]

#2. 인치를 센티미터로 변환하는 inch_to_cm() 함수를 고려해 보겠습니다. 1인치 = 2.54cm 입니다.

def inch_to_cm(inch):
    return inch*2.54

인치 값을 센티미터로 변환하려면 다음 코드 셀과 같이 map() 함수를 사용할 수 있습니다.

inches = [5.54,3.4,1,25,8.2]
cms = list(map(inch_to_cm,inches))
print(cms)

cms 리스트에는 센티미터로 변환된 인치 값이 저장됩니다.

Output
[14.0716, 8.636, 2.54, 63.5, 20.828]

내장 함수와 함께 map() 함수를 사용하는 방법

이번 섹션에서는 파이썬 내장 함수와 함께 map() 함수를 사용하는 방법을 살펴보겠습니다.

#1. 문자열 리스트인 strings가 있다고 가정합니다. 이 리스트는 프로그래밍 언어의 이름들로 구성되어 있습니다. 각 문자열을 대문자로 변환하여 새 리스트 strings_upper를 만들고 싶습니다.

strings = ['JavaScript','Rust','Python','Go']

파이썬의 내장 문자열 메서드 .upper()는 문자열에 적용되어 대문자로 변환된 복사본을 반환합니다.

strings_upper = list(map(str.upper,strings))
print(strings_upper)

strings_upper 리스트에는 대문자로 변환된 문자열들이 저장됩니다.

Output
['JAVASCRIPT', 'RUST', 'PYTHON', 'GO']

#2. 파이썬 내장 함수 len()은 시퀀스를 인수로 받아 해당 시퀀스의 길이를 반환합니다. 문자열 리스트에서 각 문자열의 길이를 구하려면 map() 함수를 사용하여 각 문자열에 len() 함수를 적용할 수 있습니다.

strings_len = list(map(len,strings))
print(strings_len)
Output
[10, 4, 6, 2]

#3. map() 함수는 튜플과 같은 다른 컬렉션에도 사용할 수 있습니다.

다음 예시는 침실 개수, 면적, 집이 위치한 도시에 대한 정보를 담고 있는 튜플을 포함합니다.

파이썬에서 type() 함수는 모든 파이썬 객체의 데이터 유형을 반환합니다. 이 튜플의 각 요소의 데이터 유형을 얻으려면 map() 함수를 사용하여 각 요소에 type() 함수를 호출할 수 있습니다.

house = (2,758.5,'Bangalore')
house_elt_type = tuple(map(type,house))
print(house_elt_type)

맵 객체를 튜플로 변환했습니다. 리스트나 다른 컬렉션으로 변환할 수도 있습니다.

출력 결과에서 2, 758.5, Bangalore의 데이터 유형이 각각 int, float, str로 추론된 것을 확인할 수 있습니다.

Output
(<class 'int'>, <class 'float'>, <class 'str'>)

#4. 파이썬에서는 모듈을 import하여 해당 모듈에 정의된 기능을 사용할 수 있습니다.

nums 리스트에 있는 모든 숫자의 제곱근을 계산하려면 math 모듈의 sqrt 함수를 사용할 수 있습니다.

import math
nums = [30,90,34,45,97]
nums_sqrt = list(map(math.sqrt,nums))
print(nums_sqrt)
Output
[5.477225575051661, 9.486832980505138, 5.830951894845301, 6.708203932499369, 9.848857801796104]

위 출력은 분석하고 따라가기가 어렵습니다. 소수점 이하 두 자리까지 각 제곱근 값을 반올림해 보겠습니다.

파이썬에서 부동 소수점 숫자를 반올림하는 방법

부동 소수점 값을 받아 소수점 이하 두 자리로 반올림하는 round_2() 함수를 정의해 보겠습니다.

def round_2(num):
    return round(num,2)

이제 round_2 함수와 nums_sqrt 리스트를 사용하여 map() 함수를 사용할 수 있습니다.

nums_sqrt_round = list(map(round_2,nums_sqrt))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

내부 map 함수가 제곱근 리스트인 nums_sqrt를 계산하고 외부 map 함수가 반올림 연산을 수행하는 중첩된 map() 함수를 사용할 수도 있습니다.

nums_sqrt_round = list(map(round_2,list(map(math.sqrt,nums))))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

위 두 가지 접근 방식 모두 출력 결과는 같습니다. 그러나 위와 같이 함수를 중첩할 때는 코드를 읽고 유지 관리하기 용이하도록 작성해야 합니다.

람다 함수와 함께 map() 함수를 사용하는 방법

이전 섹션에서는 내장 함수 및 사용자 정의 함수와 함께 파이썬 map() 함수를 사용하는 방법을 배웠습니다. 이제 람다 함수라고 하는 파이썬의 익명 함수와 함께 map() 함수를 사용하는 방법을 살펴보겠습니다.

때로는 함수 본문에 단 한 줄의 코드만 필요하고 함수를 한 번만 사용하고 프로그램의 다른 곳에서는 참조하지 않아야 할 경우가 있습니다. 파이썬에서는 람다 함수를 사용하여 이러한 함수를 정의할 수 있습니다.

참고: lambda args: expression은 파이썬 람다 함수를 사용하는 일반적인 구문입니다.

#1. 다음 문자열 리스트를 고려해 보겠습니다. 각 문자열의 역순 복사본을 포함하는 strings_rev 리스트를 얻으려고 합니다.

strings = ['JavaScript','Rust','Python','Go']

파이썬 문자열 슬라이싱을 사용하여 문자열을 역순으로 만들 수 있습니다.

참고: 이것은 문자열 슬라이싱 표현식 str[start:stop:step]의 일반화된 형태입니다.

startstop 값이 없으면 슬라이스는 문자열의 시작 부분부터 문자열의 끝까지 확장됩니다.
step의 음수 값은 문자열의 끝에서 시작하는 슬라이스를 제공합니다.
– 따라서 str[::-1]은 str의 역순 복사본을 반환합니다.

다음 람다 함수 lambda x:x[::-1]map 함수 내에서 사용할 수 있습니다.

strings_rev = list(map(lambda x:x[::-1],strings))
print(strings_rev)

다른 예시와 마찬가지로 맵 객체를 리스트로 변환합니다. 출력 결과에서 리스트 strings의 각 문자열이 역순으로 바뀐 것을 확인할 수 있습니다.

Output
['tpircSavaJ', 'tsuR', 'nohtyP', 'oG']

#2. 이전 섹션에서 숫자 리스트에 있는 모든 숫자의 제곱근을 계산한 다음 각 제곱근 값을 소수점 이하 두 자리로 반올림했습니다.

이를 위해 round_2() 함수를 사용했습니다. round_2() 함수를 람다 함수로 다시 작성하여 아래에 설명된 map() 함수와 함께 사용해 보겠습니다.

nums_sqrt_round_l =list(map(lambda num:round(num,2),nums_sqrt))
print(nums_sqrt_round_l)

출력에서 round_2() 함수를 사용하여 얻은 결과와 동일한 것을 확인할 수 있습니다.

Output
[5.48, 9.49, 5.83, 6.71, 9.85]

여러 개의 반복 가능한 객체와 함께 map() 함수를 사용하는 방법

지금까지 우리는 하나의 반복 가능한 객체의 모든 항목에 함수를 적용하는 예시를 살펴보았습니다.

하지만 때로는 둘 이상의 인수를 받는 함수가 있을 수 있습니다. 이 경우 각 인수는 리스트나 유사한 컬렉션에 저장될 수 있습니다.

파이썬 map() 함수는 여러 개의 리스트와 함께 사용할 수도 있습니다.

#1. 길이와 너비를 입력으로 받아들이고 길이 * 너비 영역을 반환하는 다음 함수 area()를 생각해 보겠습니다.

def area(length,breadth):
    return length*breadth

서로 다른 직사각형의 길이와 너비는 각각 lengthsbreadths라는 두 개의 개별 리스트에 저장되어 있습니다.

lengths = [4,8,10,18]
breadths = [9,4,6,11]

map() 함수를 사용하여 lengthsbreadths 리스트를 모두 전달하여 위 리스트에 area 함수를 적용할 수 있습니다.

areas = list(map(area,lengths,breadths))
print(areas)

area 함수는 두 개의 인수를 허용하므로 lengthsbreadths 리스트에서 각각 길이와 너비 값을 사용합니다.

Output
[36, 32, 60, 198]

#2. 파이썬 math 모듈에는 임의의 밑수에 대한 로그를 계산하는 데 도움이 되는 log 함수가 있습니다.

참고: log(x, base)는 x의 로그 값을 밑수가 base인 값으로 반환합니다. 밑수가 지정되지 않은 경우 기본 밑수는 e입니다(로그는 자연 로그를 계산).

이 예시에서는:

  • x 리스트는 로그를 계산하려는 값에 해당합니다.
  • base 리스트는 로그 계산에 사용할 모든 밑수를 포함합니다.
x = [2,6,12,10]
base = [2,3,2,5]

다음과 같이 math.log, 리스트 x, base와 함께 파이썬 map() 함수를 사용하여 새 리스트 log_x를 얻을 수 있습니다.

log_x = list(map(math.log,x,base))
print(log_x)

다음은 출력 결과입니다.

Output
[1.0, 1.6309297535714573, 3.5849625007211565, 1.4306765580733933]

결론

본 튜토리얼에서 배운 내용을 요약하면 다음과 같습니다.

  • 파이썬 map() 함수는 map(함수, 반복가능한_객체(들)) 구문을 사용하여 함수와 하나 이상의 반복 가능한 객체를 인수로 사용합니다.
  • 함수는 모든 유효한 파이썬 호출 가능한 객체일 수 있습니다.
  • 함수가 k개의 인수를 취하면 map() 함수는 함수와 k개의 인수를 각각의 반복 가능한 객체에서 함께 사용합니다.

다음 튜토리얼에서는 파이썬에서 집합을 사용하는 방법을 알아보겠습니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.