다음과 같이 함수가 추가되었다고 가정 해 봅시다.
def add(x, y):
return x + y
배열에 map 함수를 적용하고 싶습니다
map(add, [1, 2, 3], 2)
의미는 배열의 모든 요소에 2를 추가하고 싶습니다. 그러나이 map
함수에는 세 번째 인수에도 목록이 필요합니다.
참고 : 간단하게 추가 예제를 작성하고 있습니다. 내 원래 기능은 훨씬 더 복잡합니다. 물론 y
추가 기능 의 기본값을 설정하는 옵션은 모든 호출에 대해 변경되므로 의문의 여지가 없습니다.
답변
하나의 옵션은 목록 이해입니다.
[add(x, 2) for x in [1, 2, 3]]
더 많은 옵션 :
a = [1, 2, 3]
import functools
map(functools.partial(add, y=2), a)
import itertools
map(add, a, itertools.repeat(2, len(a)))
답변
문서는 이것이 다음의 주요 용도라고 명시 적으로 제안합니다 itertools.repeat
.
반복해서 객체를 반환하는 반복자를 만듭니다. times 인수가 지정되지 않으면 무한정 실행됩니다.
map()
호출 된 함수 에 대한 불변 매개 변수 에 대한 인수로 사용됩니다 .zip()
튜플 레코드의 고정 부분을 만드는 데에도 사용됩니다 .
그리고 패스에 대한 이유가되지 len([1,2,3])
는 AS times
인수; map
첫 번째 iterable이 소비되는 즉시 중지되므로 무한 iterable은 완벽하게 좋습니다.
>>> from operator import add
>>> from itertools import repeat
>>> list(map(add, [1,2,3], repeat(4)))
[5, 6, 7]
실제로 이것은 repeat
문서 의 예제와 동일합니다 .
>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
이것은 파이썬 반복자 용어로 완벽하게 읽을 수있는 멋진 게으른 기능 언어 솔루션을 만듭니다.
답변
목록 이해력을 사용하십시오.
[x + 2 for x in [1, 2, 3]]
당신이 경우 정말 , 정말 , 정말 사용하려면 map
, 그것을 첫 번째 인수로 익명 함수를 제공합니다 :
map(lambda x: x + 2, [1,2,3])
답변
지도에는 여러 개의 인수가 포함될 수 있습니다. 표준 방법은
map(add, a, b)
귀하의 질문에, 그것은
map(add, a, [2]*len(a))
답변
정답은 생각보다 간단합니다. 간단히 :
map(add, [(x, 2) for x in [1,2,3]])
그리고 튜플을 가져 오기 위해 add 구현을 변경하십시오.
def add(t):
x, y = t
return x+y
이것은 두 추가 매개 변수가 모두 동적 인 복잡한 사용 사례를 처리 할 수 있습니다.
답변
때로는 클로저 를 사용하여 유사한 상황 (예 : pandas.apply 메소드 사용)을 해결했습니다.
그것들을 사용하기 위해 함수의 래퍼를 동적으로 정의하고 반환하는 함수를 정의하여 효과적으로 매개 변수 중 하나를 상수로 만듭니다.
이 같은:
def add(x, y):
return x + y
def add_constant(y):
def f(x):
return add(x, y)
return f
그런 다음 주어진 값 add_constant(y)
에 추가 y
하는 데 사용할 수있는 함수를 반환 합니다.
>>> add_constant(2)(3)
5
매개 변수가 한 번에 하나씩 제공되는 모든 상황에서 사용할 수 있습니다.
>>> map(add_constant(2), [1,2,3])
[3, 4, 5]
편집하다
다른 곳에서 클로저 함수를 작성하지 않으려는 경우 람다 함수를 사용하여 즉시이를 작성할 수 있습니다.
>>> map(lambda x: add(x, 2), [1, 2, 3])
[3, 4, 5]
답변
사용 가능한 경우 numpy를 사용하는 것이 좋습니다. 이러한 유형의 작업에는 매우 빠릅니다.
>>> import numpy
>>> numpy.array([1,2,3]) + 2
array([3, 4, 5])
이것은 실제 응용 프로그램이 수학 연산을 수행한다고 가정합니다 (벡터화 가능).