목록의 모든 항목을 파이썬과 함께 곱할 수 있습니까?


204

숫자 목록 을 가져 와서 곱하는 함수를 작성 해야합니다. 예 : [1,2,3,4,5,6]나에게 줄 것이다 1*2*3*4*5*6. 정말 당신의 도움을 사용할 수 있습니다.

답변:


208

파이썬 3 : 사용 functools.reduce:

>>> from functools import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720

파이썬 2 : 사용 reduce:

>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720

2 및 3과 호환되는 pip install six경우 다음을 사용하십시오 .

>>> from six.moves import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720

연산자를 가져 오지 않기 때문에이 솔루션은 좀 더 간결합니다. 어느 쪽이 더 빠른지 궁금합니다.
jheld

30
@ jheld : 1에서 100 사이의 숫자를 곱할 때 시간을 정했습니다. python2와 3에서 lambda평균 .02s / 1000 반복을 사용하는 반면 operator.mul평균 .009s / 1000 반복을 사용 operator.mul하여 10 배 빠른 속도 를 얻었습니다 .
whereswalden은

4
@words 아마도 아마도 추가 기능 (lambda)을 operator.mul
거치면

4
나는 .009를 .02보다 작은 차수로 부르지 않을 것입니다. 약 절반 정도입니다.
jlh

1
Python 3.8부터는 간단히 수행 할 수 있습니다 math.prod([1,2,3,4,5,6]). (수입 과정 필요)
Tomerikoo

168

당신이 사용할 수있는:

import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)

참조 reduceoperator.mul설명에 대한 문서화.

import functools파이썬 3 이상 에서 라인 이 필요합니다 .


32
python3에서는 reduce()함수가 전역 네임 스페이스에서 제거되어 functools모듈에 배치되었습니다 . 그래서 python3에서는 말할 필요가 있습니다 from functools import reduce.
유진 야마 쉬

2
여기서 세 번째 논거 인 '1'은 불필요합니다. 필요한 경우는 무엇입니까?
wordsforthewise

5
@wordsforthewise 세 번째 인수없이 빈 시퀀스를 전달하면 TypeError 예외가 발생합니다.
Francisco Couzo

1
lambda x,y: x*y대신 작품operator.mul

78

나는를 사용하는 것이 numpy.prod작업을 수행 할 수 있습니다. 아래를 참조하십시오.

import numpy as np
mylist = [1, 2, 3, 4, 5, 6] 
result = np.prod(np.array(mylist))  

13
이미 Numpy를 사용하고 있다면 편리합니다. 아마 목록으로 먼저 캐스트 할 필요조차 없습니다. 이것은 대부분의 경우 작동합니다result = np.prod(mylist)
Nick

4
주의해야 할 두 가지 : 1) 특히 numpy.int32위와 같이 기본값 을 사용하는 경우 오버플로가 발생할 수 있습니다. 2) 작은 목록의 경우 NumPy가 배열을 할당해야하므로 (자주 반복되는 경우 관련)
Disenchanted

1
21 이상의 값에 오버플로np.prod(np.array(range(1,21)))
PatrickT

좋은 선택이 아닙니다. 오버플로가 발생하고 속도가 느려집니다. 시도하십시오 reduce.
Peyman

57

가져 오기를 피하고 더 복잡한 Python 영역을 피하려면 간단한 for 루프를 사용할 수 있습니다

product = 1  # Don't use 0 here, otherwise, you'll get zero 
             # because anything times zero will be zero.
list = [1, 2, 3]
for x in list:
    product *= x

7
사소한 참고 사항 : 파이썬의 조각은 매우 쉽습니다. 여기서는 프리미티브만을 다루기 때문에 list [0]으로 시작하고 list [1 :]을 반복하여 1로 시작하는 사소한 혼란을 피할 수 있습니다. 보다 기능적인 '감소'답변에 익숙해지는 것이 장기적으로는 가치가 있지만 다른 상황에서도 유용합니다.
kungphu

@kungphu 빈 제품은 일반적으로 1로 정의되며 빈 시퀀스를 전달하면 솔루션에서 IndexError 예외가 발생합니다.
Francisco Couzo

@Francisco Granted, 그러나 빈 시퀀스는이 함수에 대해 유효하지 않은 입력이기 때문에이 함수는 아마도이 경우에 약간의 예외를 발생 시켜야 합니다. 실제로이 함수는 값이 두 개 미만인 시퀀스에는 의미가 없습니다. 하나의 값으로 시퀀스를 전달하고 1을 곱하면 기본적으로 존재하지 않는 값을 추가했습니다. 이는 예기치 않은 동작에 해당합니다.
kungphu

1
@kungphu,이 답변의 동작은 정확합니다. 즉, 길이 1의 목록을 전달하면 값이 반환되고 길이 0의 목록을 전달하면 1이 반환됩니다. ([3]) as 3. 참조 : en.wikipedia.org/wiki/Empty_product
emorris

수학 함수에 관한 요점을 봅니다. 그러나 실제 개발 상황에서는 입력에서 명시 적으로 작동하도록 의도 된 함수가 입력이 없거나 유효하지 않은 입력에 해당하는 값을 반환 해야하는 매우 드문 상황이라고 부릅니다 . 연습의 목표에 달려 있다고 생각합니다. 표준 라이브러리를 복제하는 것이라면 사람들에게 (또는 a) 언어가 어떻게 구현되는지 또는 어떻게 구현 될 수 있는지에 대해 가르쳐 줄 것입니다. 그렇지 않으면 나는 유효하고 잘못된 주장에 대한 교훈을 제공 할 수있는 좋은 기회를 놓치고 있다고 말하고 싶습니다.
kungphu

14

시작 Python 3.8하여 .prod함수가 math표준 라이브러리 의 모듈에 포함되었습니다 .

math.prod(iterable, *, start=1)

이 메소드는 start반복 가능한 숫자 의 값 (기본값 : 1)에 곱을 곱 합니다.

import math
math.prod([1, 2, 3, 4, 5, 6])

>>> 720

iterable이 비어 있으면 1(또는 start제공된 경우 값) 생성됩니다.


10

내 기계의 성능 측정 결과는 다음과 같습니다. 장기 실행 루프에서 작은 입력에 대해 수행되는 경우와 관련이 있습니다.

import functools, operator, timeit
import numpy as np

def multiply_numpy(iterable):
    return np.prod(np.array(iterable))

def multiply_functools(iterable):
    return functools.reduce(operator.mul, iterable)

def multiply_manual(iterable):
    prod = 1
    for x in iterable:
        prod *= x

    return prod

sizesToTest = [5, 10, 100, 1000, 10000, 100000]

for size in sizesToTest:
    data = [1] * size

    timerNumpy = timeit.Timer(lambda: multiply_numpy(data))
    timerFunctools = timeit.Timer(lambda: multiply_functools(data))
    timerManual = timeit.Timer(lambda: multiply_manual(data))

    repeats = int(5e6 / size)
    resultNumpy = timerNumpy.timeit(repeats)
    resultFunctools = timerFunctools.timeit(repeats)
    resultManual = timerManual.timeit(repeats)
    print(f'Input size: {size:>7d} Repeats: {repeats:>8d}    Numpy: {resultNumpy:.3f}, Functools: {resultFunctools:.3f}, Manual: {resultManual:.3f}')

결과 :

Input size:       5 Repeats:  1000000    Numpy: 4.670, Functools: 0.586, Manual: 0.459
Input size:      10 Repeats:   500000    Numpy: 2.443, Functools: 0.401, Manual: 0.321
Input size:     100 Repeats:    50000    Numpy: 0.505, Functools: 0.220, Manual: 0.197
Input size:    1000 Repeats:     5000    Numpy: 0.303, Functools: 0.207, Manual: 0.185
Input size:   10000 Repeats:      500    Numpy: 0.265, Functools: 0.194, Manual: 0.187
Input size:  100000 Repeats:       50    Numpy: 0.266, Functools: 0.198, Manual: 0.185

Numpy는 곱셈이 수행되기 전에 배열을 할당하기 때문에 더 작은 입력에서 상당히 느리다는 것을 알 수 있습니다. 또한 Numpy의 오버플로에주의하십시오.


호기심 에서 평가 방법을 추가 할 수 있습니다
Mr_and_Mrs_D

나는 그것을 의심 multiply_functools하고 multiply_numpy 위로 볼 필요에 의해 아래로 무게가있다 np, functools그리고 operator속성 조회 한 다음 전역을. 현지인으로 전환 하시겠습니까? _reduce=functools.reduce, _mul = operator.mul` 다음 함수 시그니처 return _reduce(_mul, iterable)에서 본문 등
Martijn Pieters

1
또한 numpy 버전은 먼저 숫자를 numpy 배열로 변환해야합니다. 타이밍에 포함시키기 위해 일반적으로 이미 그 변환을 했었을 것입니다. 목록을 numpy 배열로 한 번 변환하면 np.prod()옵션이 100 개 이상의 요소에서 시작됩니다.
Martijn Pieters

8

나는 일반 목록의 모든 요소를 ​​함께 곱하는 함수에 대해 개인적으로 이것을 좋아합니다.

def multiply(n):
    total = 1
    for i in range(0, len(n)):
        total *= n[i]
    print total

컴팩트하고 간단한 것 (변수 및 for 루프)을 사용하며 직관적입니다. (문제에 대해 생각하고, 하나만 취하고, 곱한 다음 다음에 곱하는 등의 방식으로 보입니다.) )


3
가장 간단하고 가장 평범합니다.
ghostkraviz

4
for i in n:, 그 다음 total *= i? 훨씬 간단하지 않습니까?
Munim Munna

@MunimMunnaIt 위와 같은 방식으로 작동하지 않았습니다.
athul

5

간단한 방법은 다음과 같습니다.

import numpy as np
np.exp(np.log(your_array).sum())

10
그냥 np.prod(your_Array)
어때

3

Numpyprod()리스트의 곱을 반환 하는 함수를 가지고 있거나,이 경우에는 numpy이므로 주어진 축에 대한 배열의 곱입니다

import numpy
a = [1,2,3,4,5,6]
b = numpy.prod(a)

... 또는 다른 방법으로 가져올 수 있습니다 numpy.prod().

from numpy import prod
a = [1,2,3,4,5,6]
b = prod(a)

2

오늘이 질문을 찾았지만 None목록에있는 경우가 없다는 것을 알았습니다 . 따라서 완전한 솔루션은 다음과 같습니다.

from functools import reduce

a = [None, 1, 2, 3, None, 4]
print(reduce(lambda x, y: (x if x else 1) * (y if y else 1), a))

추가의 경우 다음이 있습니다.

print(reduce(lambda x, y: (x if x else 0) + (y if y else 0), a))

2
nums = str(tuple([1,2,3]))
mul_nums = nums.replace(',','*')
print(eval(mul_nums))

5
답변에 설명을 추가하십시오. 답변 방법
xenteros

3
나는 차임하고 코드를 설명하려고 시도합니다.이 코드는 개인적으로 문자열을 인수 또는 함수로 해석하는 eval을 사용하기 때문에별로 좋아하지 않습니다. 따라서 특히 입력 데이터를 처리 할 때 안전하지 않은 것으로 간주됩니다 ). 그 앞에있는 행은 모든 구분 쉼표를 곱셈으로 대체 *하여 평가자가이를 곱셈으로 인식합니다. 다른 솔루션과 비교할 때이 성능이 어떤지 궁금합니다.
dennlinger

와우, 그런 나쁜 생각!
코왈 스키

1

다음과 같은 방법으로 이것을 원합니다.

    def product_list(p):
          total =1 #critical step works for all list
          for i in p:
             total=total*i # this will ensure that each elements are multiplied by itself
          return total
   print product_list([2,3,4,2]) #should print 48

1

이것은 내 코드입니다.

def product_list(list_of_numbers):
    xxx = 1
    for x in list_of_numbers:
        xxx = xxx*x
    return xxx

print(product_list([1,2,3,4]))

결과 : ( '1 * 1 * 2 * 3 * 4', 24)


0

재귀를 사용하는 것은 어떻습니까?

def multiply(lst):
    if len(lst) > 1:
        return multiply(lst[:-1])* lst[-1]
    else:
        return lst[0]


-1

'' '루프의 논리 사용을 이해하는 유일한 간단한 방법' ''

랩에서 i에 대한 랩 = [2,5,7,7,9] x = 1 : x = i * x print (x)


귀하의 답변은이 질문에 대한 새로운 내용을 추가하지 않습니다.
시드

-3

수입하지 않는 것은 매우 간단합니다. 이것은 내 코드입니다. 목록의 모든 항목을 곱하고 해당 제품을 반환하는 함수를 정의합니다.

def myfunc(lst):
    multi=1
    for product in lst:
        multi*=product
    return product

2
DeadChex의 답변, piSHOCK의 답변, Shakti Nandan의 답변과 중복됩니다. 이미 제안 된 답변을 게시하지 마십시오.
Munim Munna 2016 년

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