데이터 처리를 위한 파이썬 맵 함수에 대한 궁극적인 가이드

소개

우리는 Python 내장 함수 map()을 사용하여 반복 가능한 객체(예: 리스트 또는 사전)의 각 항목에 함수를 적용하고 결과를 검색하기 위한 새로운 이터레이터를 반환할 수 있습니다. map()은 맵 객체(이터레이터)를 반환하며, 이를 프로그램의 다른 부분에서 사용할 수 있습니다. 또한 맵 객체를 list() 함수나 다른 시퀀스 유형에 전달하여 이터러블을 생성할 수 있습니다.

map() 함수의 구문은 다음과 같습니다:

map(function, iterable, [iterable 2, iterable 3, ...])

for 루프를 사용하는 대신, map() 함수는 반복 가능한 객체의 모든 항목에 함수를 적용하는 방법을 제공합니다. 따라서 아이템을 다른 이터러블로 복사하기보다는 한 번에 하나의 아이템에만 함수를 적용하므로 더 효율적일 수 있습니다. 이는 대용량 데이터 세트를 처리하는 프로그램에서 특히 유용합니다. map()은 한 번에 각 이터러블에서 하나의 항목을 함수에 보내어 함수의 인수로 여러 이터러블을 받을 수도 있습니다.

이번 튜토리얼에서는 map()을 사용하는 세 가지 방법에 대해 살펴보겠습니다: lambda 함수, 사용자 정의 함수, 그리고 마지막으로 여러 반복 가능한 인수를 사용하는 내장 함수를 이용하는 방법입니다.

람다 함수 사용하기

map()의 첫 번째 인수는 함수로, 우리는 이를 각 항목에 적용하는 데 사용합니다. Python은 map()에 전달한 반복 가능한 항목마다 함수를 한 번 호출하고, 조작된 항목을 맵 객체 내에서 반환합니다. 첫 번째 함수 인수로는 사용자 정의 함수를 전달하거나, 표현식이 덜 복잡할 때 lambda 함수를 사용할 수 있습니다.

map()을 람다 함수와 함께 사용하는 구문은 다음과 같습니다:

map(lambda item: item[] expression, iterable)

다음과 같은 리스트로, 우리는 리스트의 각 항목에 적용하고자 하는 표현식을 가진 lambda 함수를 구현할 수 있습니다:

numbers = [10, 15, 21, 33, 42, 55]

각 숫자에 대해 표현식을 적용하기 위해 map()lambda를 사용할 수 있습니다:

mapped_numbers = list(map(lambda x: x * 2 + 3, numbers))

여기서 우리는 리스트의 항목을 x로 선언합니다. 그런 다음 우리의 표현식을 추가합니다. 우리는 숫자 리스트를 map()의 반복 가능한 항목으로 전달합니다.

이 결과를 즉시 받기 위해 map 객체의 리스트를 출력합니다:

print(mapped_numbers)
Output
[23, 33, 45, 69, 87, 113]

list()를 사용하여 맵 객체를 <map object at 0x7fc250003a58>와 같은 덜 읽기 쉬운 객체가 아닌 리스트로 반환하도록 했습니다. 맵 객체는 결과에 대한 반복자이므로 for 문으로 반복할 수 있거나 list()를 사용하여 리스트로 변환할 수 있습니다. 여기서 이렇게 하는 이유는 결과를 검토하는 좋은 방법이기 때문입니다.

결국 map()은 대규모 데이터 세트를 다룰 때 가장 유용하므로, 우리는 맵 객체와 더 작업할 가능성이 높고 일반적으로 list()와 같은 생성자를 사용하지 않을 것입니다.

작은 데이터 세트의 경우 리스트 컴프리헨션이 더 적합할 수 있지만, 이 튜토리얼의 목적을 위해 작은 데이터 세트를 사용하여 map()를 보여주고 있습니다.

사용자 정의 함수 구현

lambda와 유사하게, 우리는 정의한 함수를 iterable에 적용할 수 있습니다. lambda 함수는 한 줄 표현식을 사용할 때 더 유용하지만, 표현식이 복잡해질 때는 사용자 정의 함수가 더 적합합니다. 또한, iterable에 적용할 함수에 다른 데이터를 전달해야 할 때, 사용자 정의 함수가 가독성 측면에서 더 나은 선택이 될 수 있습니다.

예를 들어, 다음 iterable에서 각 항목은 우리의 수족관 생물에 대한 다양한 세부 정보를 포함하는 사전입니다:

aquarium_creatures = [
 {"name": "sammy", "species": "shark", "tank number": 11, "type": "fish"},
 {"name": "ashley", "species": "crab", "tank number": 25, "type": "shellfish"},
 {"name": "jo", "species": "guppy", "tank number": 18, "type": "fish"},
 {"name": "jackie", "species": "lobster", "tank number": 21, "type": "shellfish"},
 {"name": "charlie", "species": "clownfish", "tank number": 12, "type": "fish"},
 {"name": "olly", "species": "green turtle", "tank number": 34, "type": "turtle"}
]

모든 수족관 생물들이 사실 동일한 탱크로 이동하기로 결정했습니다. 모든 생물들이 탱크 42로 이동하고 있음을 반영하기 위해 기록을 업데이트해야 합니다. map()가 각 사전과 사전의 각 키:값 쌍에 접근할 수 있도록 중첩 함수를 구성합니다:

def assign_to_tank(aquarium_creatures, new_tank_number):
 def apply(x):
  x["tank number"] = new_tank_number
  return x
 return map(apply, aquarium_creatures)

우리는 aquarium_creaturesnew_tank_number를 매개변수로 받는 assign_to_tank() 함수를 정의합니다. assign_to_tank()에서는 마지막 줄에서 map()에 함수로 apply()를 전달합니다. assign_to_tank 함수는 map()의 결과로 생성된 반복자를 반환합니다.

apply()x를 인수로 받으며, 이는 우리 목록의 항목 — 단일 사전을 나타냅니다.

다음으로 xaquarium_creatures"tank number" 키임을 정의하고, 전달된 new_tank_number를 저장해야 한다고 정합니다. 우리는 새 탱크 번호를 적용한 후 각 항목을 반환합니다.

각 생물에 대해 교체할 새 탱크 번호와 함께 사전 목록을 가지고 assign_to_tank()를 호출합니다:

assigned_tanks = assign_to_tank(aquarium_creatures, 42)

함수가 완료되면 assigned_tanks 변수에 맵 객체가 저장되고, 이를 리스트로 변환하여 출력합니다:

print(list(assigned_tanks))

이 프로그램에서 다음과 같은 출력을 받게 됩니다:

Output
[{'name': 'sammy', 'species': 'shark', 'tank number': 42, 'type': 'fish'}, {'name': 'ashley', 'species': 'crab', 'tank number': 42, 'type': 'shellfish'}, {'name': 'jo', 'species': 'guppy', 'tank number': 42, 'type': 'fish'}, {'name': 'jackie', 'species': 'lobster', 'tank number': 42, 'type': 'shellfish'}, {'name': 'charlie', 'species': 'clownfish', 'tank number': 42, 'type': 'fish'}, {'name': 'olly', 'species': 'green turtle', 'tank number': 42, 'type': 'turtle'}]

우리는 새 탱크 번호를 사전 목록에 매핑했습니다. 우리가 정의한 함수를 사용하여, 각 항목에 효율적으로 함수를 적용하기 위해 map()를 통합할 수 있습니다.

여러 반복 가능한 객체와 함께 내장 함수 사용하기

lambda 함수나 우리가 정의한 함수와 마찬가지로, map()와 함께 Python 내장 함수를 사용할 수 있습니다. 여러 개의 반복 가능한 객체와 함께 함수를 적용하려면 첫 번째 객체 뒤에 또 다른 반복 가능한 객체 이름을 전달하면 됩니다. 예를 들어, 두 숫자를 받아서 기저 숫자의 거듭제곱을 계산하는 pow() 함수를 사용할 수 있습니다.

여기에서 우리는 pow()와 함께 사용하고 싶은 정수 목록이 있습니다:

base_numbers = [2, 4, 6, 8, 10]
powers = [1, 2, 3, 4, 5]

다음으로 pow()를 함수로 map()에 전달하고 두 개의 목록을 반복 가능한 객체로 제공합니다:

numbers_powers = list(map(pow, base_numbers, powers))

print(numbers_powers)

map()는 각 목록의 동일한 항목에 pow() 함수를 적용하여 거듭제곱을 제공합니다. 따라서 우리의 결과는 2**1, 4**2, 6**3 등으로 표시됩니다:

Output
[2, 16, 216, 4096, 100000]

만약 map()에 다른 것보다 긴 반복 가능한 객체를 제공하면, map()는 가장 짧은 반복 가능한 객체의 끝에 도달하면 계산을 중지합니다. 다음 프로그램에서는 base_numbers에 세 개의 추가 숫자를 추가하고 있습니다:

base_numbers = [2, 4, 6, 8, 10, 12, 14, 16]
powers = [1, 2, 3, 4, 5]

numbers_powers = list(map(pow, base_numbers, powers))

print(numbers_powers)

결과적으로, 이 프로그램의 계산 내에서는 아무것도 변경되지 않으며 여전히 동일한 결과를 제공합니다:

Output
[2, 16, 216, 4096, 100000]

우리는 map() 함수를 파이썬 내장 함수와 함께 사용하였고, 여러 개의 반복 가능한 객체를 처리할 수 있음을 확인했습니다. 또한 map()가 가장 적은 항목을 가진 반복 가능한 객체의 끝에 도달할 때까지 계속해서 여러 개의 반복 가능한 객체를 처리한다는 점도 검토했습니다.

결론

이번 튜토리얼에서는 파이썬에서 map() 함수를 활용하는 다양한 방법을 탐구했습니다. 이제 당신은 map()을 사용자 정의 함수, lambda 표현식 및 기타 내장 함수와 함께 사용할 수 있는 능력을 갖추게 되었습니다. 추가로, map()는 여러 개의 반복 가능한 객체를 필요로 하는 함수에 적용할 수 있어 데이터 처리 작업에서 그 활용도를 높입니다.

시연을 위해 우리는 map()의 결과를 직접 리스트로 변환했습니다. 실제 응용에서는 반환된 맵 객체를 특정 필요에 맞게 추가로 조작할 수 있습니다.

파이썬에 대한 이해를 더욱 깊게 하기 위해 다음 자료를 활용해 주세요:

이 자원들은 파이썬의 기능을 포괄적으로 이해하고 이를 프로젝트에 효과적으로 활용하는 방법을 제공할 것입니다.

파이썬에 대해 더 배우고 싶다면, 우리의 파이썬 코딩 방법 시리즈와 파이썬 주제 페이지를 확인해 보세요. 함수형 프로그래밍에서 데이터 세트를 다루는 방법에 대해 더 배우고 싶다면, filter() 함수에 대한 기사를 확인해 보세요.

자주 묻는 질문

파이썬의 map()는 무엇을 하나요?

Python의 map() 함수는 함수와 하나 이상의 반복 가능 객체를 받아들이고, 주어진 함수를 제공된 반복 가능 객체의 각 요소에 적용하는 반복자를 반환합니다. 다시 말해, 이 함수는 반복 가능 객체의 각 항목에 함수를 “매핑”합니다. 예를 들어:

numbers = [1, 2, 3, 4]
squares = map(lambda x: x**2, numbers)

여기서 squares1, 4, 9, 16.의 반복자가 될 것입니다.

Python에서 맵을 어떻게 생성하나요?

함수와 최소한 하나의 반복 가능 객체를 인자로 사용하여 내장된 map() 함수를 호출함으로써 맵 객체를 생성합니다. 예를 들어:

def add_one(x):
    return x + 1

my_list = [1, 2, 3]
mapped = map(add_one, my_list)  # 맵 객체 생성

그런 다음 매핑된 내용을 반복하거나 리스트로 변환하여 결과를 볼 수 있습니다:

print(list(mapped))  # [2, 3, 4]

Python에서 맵은 지연 처리되나요?

네, Python 3에서는 map()지연 반복자를 반환하므로, 모든 결과를 한 번에 메모리에 처리하거나 저장하지 않습니다. 대신, 반복할 때마다 요청에 따라 각 결과를 계산합니다. 이는 특히 큰 데이터 세트에 대해 메모리 효율이 더 높을 수 있지만, 동일한 맵 객체를 직접 인덱싱하거나 반복적으로 반복할 수 없음을 의미합니다.

map() 함수는 어떻게 작동하나요?

map() 함수는 다음과 같이 작동합니다:

  1. 함수와 하나 이상의 반복 가능한 객체(iterables)를 제공합니다.
  2. map()은 각 반복 가능한 객체에서 요소를 가져옵니다.
  3. 그 요소들을 인수로 하여 함수를 호출합니다.
  4. 그 함수 호출의 결과를 반환합니다.
  5. 이 과정을 반복하여 어떤 반복 가능한 객체가 소진될 때까지 계속합니다.

여러 개의 반복 가능한 객체가 주어지면, map()은 가장 짧은 반복 가능한 객체가 소진될 때 중지합니다. 예를 들어:

numbers = [1, 2, 3]
others = [10, 20, 30]
result = map(lambda x, y: x + y, numbers, others)
print(list(result))  # [11, 22, 33]

파이썬에서 map을 사용해야 할까요?

map() 사용 여부는 개인의 취향과 가독성에 따라 다릅니다:

장점:

  • 경우에 따라 더 간결할 수 있습니다.
  • 특정 시나리오에서는 리스트 컴프리헨션보다 약간 빠를 수 있습니다(하지만 종종 그 차이가 크지 않습니다).

단점:

  • 리스트 컴프리헨션이나 제너레이터 표현식을 사용하는 코드는 종종 더 “파이썬답다”고 여겨지며 더 쉽게 읽힙니다.
  • 더 새로운 파이썬 프로그래머들은 리스트 내포가 더 직관적이라고 느낄 수 있습니다.

간단히 말해, 코드가 더 명확하고 직접적이라면 map()을 사용하세요. 그렇지 않다면, 리스트 내포나 생성자 표현식이 매우 일반적인 대안입니다.

파이썬에서 map을 문자열로 변환하는 방법은?

map 객체는 문자열이 아니라 이터레이터입니다. map() 호출의 결과를 문자열로 변환하고 싶다면 먼저 그것을 반복(iterate)해야 합니다. 일반적인 접근 방법은 다음과 같습니다:

  • 리스트로 변환한 다음 문자열 표현으로 변환:
mapped = map(str, [1, 2, 3])
string_representation = str(list(mapped))  # "[‘1’, ‘2’, ‘3’]"
  • 결과가 문자열 요소인 경우 결합:
mapped = map(str, [1, 2, 3])
joined_string = ''.join(mapped)  # "123"

가장 좋은 방법은 사람이 읽을 수 있는 리스트 표현(str(list(...)))이 필요할지, 아니면 결과를 연결(''.join(...))할지에 따라 다릅니다.

map count()는 무엇을 하나요?

map 객체는 Python에서 내장된 count() 메서드를 가지고 있지 않습니다. count() 메서드는 리스트, 문자열 및 특정 다른 컬렉션에서 사용할 수 있습니다. map 객체에서 생성된 값의 발생 횟수를 세고 싶다면, 먼저 이를 리스트로 변환해야 합니다(이터레이터를 소비합니다):

mapped = map(lambda x: x*2, [1, 2, 3, 2])
mapped_list = list(mapped)
count_of_4 = mapped_list.count(4)  # 2, 2*2=4가 두 번 나타남

리스트로 변환하지 않고 카운트를 원하신다면, 수동으로 반복할 수 있습니다:

count_of_value = sum(1 for x in map(lambda x: x*2, [1, 2, 3, 2]) if x == 4)

Python에서 mapfilter는 무엇을 하나요?

  • map(function, iterable): iterable의 각 요소에 함수를 적용하고 결과의 이터레이터를 반환합니다.

  • filter(function, iterable): function(element)가 True인 iterable의 요소들의 이터레이터를 반환합니다. function이 None인 경우, 스스로 참인 요소들을 반환합니다.

예를 들어:

nums = [1, 2, 3, 4, 5]
mapped_nums = map(lambda x: x*2, nums)        # [2, 4, 6, 8, 10]
filtered_nums = filter(lambda x: x > 2, nums) # [3, 4, 5]

map은 각 요소를 변환하고, filter는 조건에 따라 특정 요소를 선택합니다.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-the-python-map-function