sum ()과 같은 기능이지만 곱셈의 기능은 무엇입니까? 생성물()?


206

파이썬의 sum()함수는 반복 가능한 숫자의 합을 반환합니다.

sum([3,4,5]) == 3 + 4 + 5 == 12

대신 제품을 반환하는 함수를 찾고 있습니다.

somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60

그러한 기능이 존재한다고 확신하지만 찾을 수 없습니다.

답변:


71

최신 정보:

Python 3.8에서는 prod 함수가 수학 모듈 에 추가되었습니다 . math.prod ()를 참조하십시오 .

이전 정보 : Python 3.7 및 이전

찾고있는 함수는 prod () 또는 product () 이지만 Python에는 해당 함수가 없습니다. 따라서 직접 작성해야합니다 (쉽습니다).

prod ()에 발음

네 맞습니다. Guido 는 거의 필요하지 않다고 생각했기 때문에 내장 prod () 함수에 대한 아이디어거부했습니다 .

reduce ()를 사용한 대안

제안한 것처럼 reduce ()operator.mul ()을 사용하여 직접 만드는 것은 어렵지 않습니다 .

from functools import reduce  # Required in Python 3
def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24

파이썬 3에서는 reduce () 함수가 functools 모듈 로 옮겨졌습니다 .

구체적인 경우 : 계승

참고로, prod () 의 주요 동기 사용 사례 는 계승을 계산하는 것입니다. 우리는 이미 math 모듈 에서이를 지원 합니다 .

>>> import math

>>> math.factorial(10)
3628800

대수를 이용한 대안

데이터가 부동 소수점으로 구성된 경우 지수와 로그가있는 sum () 을 사용하여 곱을 계산할 수 있습니다 .

>>> from math import log, exp

>>> data = [1.2, 1.5, 2.5, 0.9, 14.2, 3.8]
>>> exp(sum(map(log, data)))
218.53799999999993

>>> 1.2 * 1.5 * 2.5 * 0.9 * 14.2 * 3.8
218.53799999999998

주의 사용 로그는 () 모든 입력 양성해야합니다.


마지막 예제에서 float가 양수 여야한다고 덧붙일 수 있습니다 . 그렇지 않으면 cmath를 사용해야 할 수도 있지만 모든 경우에 실제로 작동하지는 않습니다.
Veky

212

실제로 Guido는이 아이디어를 거부했습니다. http://bugs.python.org/issue1093

그러나이 문제에서 언급했듯이 하나를 쉽게 만들 수 있습니다.

from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator

reduce(operator.mul, (3, 4, 5), 1)

4
다음은 Guido를 인용하기 위해 "필요한 부분"이있는 좋은 예입니다. product (filter (None, [1,2,3, None])). 잘만되면 그것은 언젠가 포함될 것입니다.
the911s

13
귀도도 싫어하는 사람 reduce아닌가요?
Chris Martin

3
그렇습니다. 축소는 더 이상 Python 3에 내장되어 있지 않습니다. IMO, 표준 (또는 타사) 라이브러리가 할 때 전역 내장에 추가 가능한 모든 목록 연산자가 필요하지는 않습니다. 내장이 많을수록 더 일반적인 단어는 지역 변수 이름으로 제한을 벗어납니다.
ojrac

7
Guido의 블로그 게시물에서 reduce ()에 대한 너겟을 찾았 습니다 . "우리는 이미 합 ()을 가지고, 내가 행복하게 ... 제품 ()에 대한 () 감소하는 무역 것" . 누구든지 product()표준 라이브러리 에 포함하기 위해 탄원하고 싶다면 이 질문에 대한 견해가 사건을 해결하는 데 도움이 될 수 있습니다.
Patrick McElhaney

1
@PatrickMcElhaney python3은 이미 내장 축소 기능을 제거 한 것처럼 들립니다. 제품이 그 기회를 놓쳤다 고 생각합니다. ;)
ojrac

41

내장 된 것이 없지만 입증 된 것처럼 자신의 것을 굴리는 것은 간단합니다. 여기에 .

import operator
def prod(factors):
    return reduce(operator.mul, factors, 1)

이 질문에 대한 답변을보십시오 :

목록에서 데이터 조작에 적합한 Python 모듈은 무엇입니까?


8
Python 3을 사용 functools.reduce하는 경우 대신을 사용하십시오 reduce.
Steven Rumbalski

1
더 functools 재미를 위해 :prod = functools.partial(functools.reduce, operator.mul)
bukzor

39

prod()원하는 것을 하는 숫자가 있습니다.


3
참고 : Python longs (임의 정밀도 정수)를 지원하지 않으므로 np.prod(range(1,13))12와 동일한 정답을 제공합니다! 그러나 np.prod(range(1,14))그렇지 않습니다.
Jason S

2
@JasonS np.prod(arange(1,14, dtype='object'))?
endolith

1
math.prod()기능이 답이되지 않는 것.
Benoît P

간단한 원 라이너로 이것을 원할 때 수학을 가져와야하는 것은 여전히 ​​지루합니다. reduce () 및 Guido-rejected product ()가 누락되었습니다.
RCross

25
Numeric.product 

(또는

reduce(lambda x,y:x*y,[3,4,5])

)


그는 함수를 직접 작성하지 않고 모듈이나 라이브러리에서로드 할 수있는 함수를 원합니다.
Jeremy L

2
그러나 이것이 없다면, 아마도 여전히 그 기능을 원할 것입니다.
DNS

1
그렇습니다.하지만 그의 주요 질문이기 때문에 존재하지 않는 것을 알아야합니다.
Jeremy L

2
또한 기본값 인 1을 줄여야합니다. 그렇지 않으면 null 인 경우 실패합니다. 빈 시퀀스의 곱은 1로 정의됩니다.
Aaron Robson

3
@CraigMcQueen Numeric은 numpy의 선행 작업 중 하나입니다.
tacaswell

22

이것을 사용하십시오

def prod(iterable):
    p = 1
    for n in iterable:
        p *= n
    return p

내장 prod기능 이 없기 때문에 .


6
당신은 정말 안티 패턴입니다 :) 줄일 생각한다
zweiterlinde

1
그는 사용할 수있는 기존 기능이 있는지 알고 싶었습니다.
Jeremy L

그리고이 답변은 존재하지 않는다는 것을 설명합니다.
EBGreen

5
@zweiterlinde : 초보자의 경우 문제 발생을 줄입니다. 이 경우을 사용 lambda a,b: a*b하면 문제가되지 않습니다. 그러나 감소는 잘 일반화되지 않으며 남용됩니다. 나는 초보자가 그것을 배우지 않는 것을 선호합니다.
S.Lott

@ S.Lott 나는 초보자가 축소 기능을 사용하는 것을 보지 못했습니다. 심지어 "중간"프로그래머조차도 일반적으로 목록 이해를 넘어선 많은 것을 알지 못합니다.
Mateen Ulhaq


2

아마도 "내장"이 아니지만 내장 된 것으로 간주합니다. 어쨌든 그냥 numpy를 사용하십시오.

import numpy 
prod_sum = numpy.prod(some_list)

그것은 "내 기계에서 작동한다"라는 말에 위험에 가깝다! Numpy는 비록 사랑 스럽지만 내장형이 아닙니다 .
RCross
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.