파이썬에서 동일하게 유지되는 함수를 매핑하기 위해 여러 인수를 수행하는 방법은 무엇입니까?


155

다음과 같이 함수가 추가되었다고 가정 해 봅시다.

def add(x, y):
    return x + y

배열에 map 함수를 적용하고 싶습니다

map(add, [1, 2, 3], 2)

의미는 배열의 모든 요소에 2를 추가하고 싶습니다. 그러나이 map함수에는 세 번째 인수에도 목록이 필요합니다.

참고 : 간단하게 추가 예제를 작성하고 있습니다. 내 원래 기능은 훨씬 더 복잡합니다. 물론 y추가 기능 의 기본값을 설정하는 옵션은 모든 호출에 대해 변경되므로 의문의 여지가 없습니다.


20
이것은 Lisp에서와 동일합니다. map(add,[1,2,3],[2]*3) 일반적 map으로 함수를 첫 번째 인수로 취하고,이 함수가 K 인수를 취 하면 K iterable 을 추적해야합니다 .addTriple(a,b,c) -> map(addTriple,[...],[...],[...])
watashiSHUN

답변:


188

하나의 옵션은 목록 이해입니다.

[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)))

1
네,하지만지도 기능에 비해 얼마나 빠릅니까?

@Shan : 매우 add()사소한 기능인 경우, 특히 비슷 함
Sven Marnach

2
@Shan :이 경우 NumPy를 살펴보십시오. 이것이 정말로 당신에게 문제가된다면, 목록 이해의 속도 차이는 map()어느 쪽도 도움이되지 않습니다.
Sven Marnach

3
@ 샨 : 전에 말했듯이 NumPy를 살펴보십시오. 루프를 벡터화 할 수 있다면 루프 속도를 적절하게 높일 수 있습니다.
Sven Marnach

1
@abarnert : OP가 Python 2 또는 3을 사용하는지 여부는 확실하지 않습니다. 예제가 Python 2에서 작동하는지 확인하기 위해 매개 변수를 포함 시켰습니다. (하는 것으로 map()동작합니다 좋아 zip_longest()그것처럼 행동하면서, 파이썬 2에서 zip()파이썬 3에서)
스벤 Marnach

60

문서는 이것이 다음의 주요 용도라고 명시 적으로 제안합니다 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]

이것은 파이썬 반복자 용어로 완벽하게 읽을 수있는 멋진 게으른 기능 언어 솔루션을 만듭니다.


2
+1 이것은 정답입니다. 물론 일부 상수와 다른 목록 또는 생성기를 사용하여 여러 매개 변수로 확장됩니다. 예 : def f(x,y,z): \\ return '.'.join([x,y,z])그런 다음 :를 list(map(f, list('abc'), repeat('foo'), list('defgh')))반환합니다 ['a.foo.d', 'b.foo.e', 'c.foo.f'].
Pierre D

5
Python 2에서는 length 인자를 제공해야합니다 repeat(). 왜냐하면 가장 긴 반복자가 해당 버전의 Python에서 소진 map()될 때까지 실행 되므로 모든 누락 된 값이 채워 집니다. 매개 변수를 전달할 "이유가 없다"고 말하는 것은 잘못입니다. None
Sven Marnach

@SvenMarnach의 의견은 사소한 것이 아닙니다 : Python 3Python 2 의 행동은 크게 다릅니다!
Agustín

36

목록 이해력을 사용하십시오.

[x + 2 for x in [1, 2, 3]]

당신이 경우 정말 , 정말 , 정말 사용하려면 map, 그것을 첫 번째 인수로 익명 함수를 제공합니다 :

map(lambda x: x + 2, [1,2,3])

16

지도에는 여러 개의 인수가 포함될 수 있습니다. 표준 방법은

map(add, a, b)

귀하의 질문에, 그것은

map(add, a, [2]*len(a))

그의 질문의 의미가 확실하지 않지만 add add 2 값을 생각하고 그 2는 고정되어 있지 않으며 arg1이 오는 것처럼 사용자로부터 와야한다고 생각합니다. 이 경우 맵에서 add (x, y)를 어떻게 호출해야합니까?
Bimlesh Sharma

15

정답은 생각보다 간단합니다. 간단히 :

map(add, [(x, 2) for x in [1,2,3]])

그리고 튜플을 가져 오기 위해 add 구현을 변경하십시오.

def add(t):
   x, y = t
   return x+y

이것은 두 추가 매개 변수가 모두 동적 인 복잡한 사용 사례를 처리 할 수 ​​있습니다.


14

때로는 클로저 를 사용하여 유사한 상황 (예 : 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]

13

사용 가능한 경우 numpy를 사용하는 것이 좋습니다. 이러한 유형의 작업에는 매우 빠릅니다.

>>> import numpy
>>> numpy.array([1,2,3]) + 2
array([3, 4, 5])

이것은 실제 응용 프로그램이 수학 연산을 수행한다고 가정합니다 (벡터화 가능).


10

정말로 map 함수를 사용해야 할 필요가 있다면 (여기의 클래스 할당과 같이), 1 개의 인수와 함께 랩퍼 함수를 ​​사용하여 나머지는 본문의 원래 함수에 전달할 수 있습니다. 즉 :

extraArguments = value
def myFunc(arg):
    # call the target function
    return Func(arg, extraArguments)


map(myFunc, itterable)

더럽고 못생긴 여전히 트릭을 수행


1
폐쇄, 나는 이것이 플러스 하나를 더한다고 생각합니다. 허용 된 답변이 가지고있는 부분 함수와 유사합니다.
Aaron Hall

1
myFunc필요return Func(arg, extraArguments)
PM 2Ring

@ PM2Ring을 수정했습니다. 사실입니다. 코드를 업데이트했습니다.
Todor Minakov 17 년

Func는 어디에 정의되어 있습니까? 나는 Func을위한 이름 오류 얻고 있기 때문에
Nikhil 슈라

Func는 원래 함수의 이름입니다. add예를 들어 OP 타이트의 경우
Todor Minakov

6

스타 맵이 필요하다고 생각합니다.

from itertools import starmap


def test(x, y, z):
    return x + y + z

list(starmap(test, [(1, 2, 3), (4, 5, 6)]))

예제에서 오타 : list (starmap (test, [(1, 2, 3), (4, 5, 6)]))
Teebu

어 그래. 감사합니다 :)
Shqi. Yang

1

map함수에 여러 인수를 전달 합니다.

def q(x,y):
    return x*y

print map (q,range(0,10),range(10,20))

여기서 qmap ()이 호출 하는 여러 인수가있는 함수입니다 . 두 범위의 길이, 즉

len (range(a,a')) and len (range(b,b')) are equal.

1

에 :nums = [1, 2, 3]

에 :map(add, nums, [2]*len(nums))

밖:[3, 4, 5]


1
이것은 질문에 대한 답변을 제공하지 않습니다. 당신은 할 수 있습니다 비슷한 질문을 검색 하거나, 답변을 찾을 페이지의 오른쪽에있는 관련 및 연결 문제를 참조하십시오. 관련이 있지만 다른 질문이있는 경우 새로운 질문 을하고 컨텍스트를 제공하는 데 도움이되는 링크를 포함 시키십시오. 참조 : 질문을하고 답을 얻고 방해받지
마십시오


1
def func(a, b, c, d):
 return a + b * c % d
map(lambda x: func(*x), [[1,2,3,4], [5,6,7,8]])

함수 호출을 람다로 감싸고 별표 풀기를 사용하면 임의의 수의 인수로 맵을 수행 할 수 있습니다.


람다 대신 매우 느린, 사용 functools입니다

0

다른 옵션은 다음과 같습니다.

results = []
for x in [1,2,3]:
    z = add(x,2)
    ...
    results += [f(z,x,y)]

이 형식은 여러 함수를 호출 할 때 매우 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.