web-dev-qa-db-ja.com

リストのすべての項目をPythonと一緒に乗るにはどうすればいいですか?

私は数のリスト乗算を取る関数を書く必要があります一緒に。例:[1,2,3,4,5,6]は私に1*2*3*4*5*6を与えます。私は本当にあなたの助けを借りることができました。

171
user1897814

Python 3:functools.reduceを使う:

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

Python 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
182
rikAtee

あなたが使用することができます:

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

説明は reduceoperator.mul のドキュメントを参照してください。

Python 3+ではimport functools行が必要です。

155
icecrime

タスクを実行するにはnumpy.prodを使います。下記参照。

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

何かをインポートすることを避け、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
48
DeadChex

これが私のマシンのパフォーマンス測定です。これが長時間実行されるループ内の小さい入力に対して実行される場合に関連します。

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のオーバーフローに気をつけてください。

8
pishock

私は個人的には一般的なリストのすべての要素を掛け合わせる関数のためにこれが好きです:

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

それはコンパクトで、単純なもの(変数とforループ)を使い、そして私には直感的に感じます(問題をどう考えたらいいのか、ただ1つ取り、それを掛け、それから次のものを掛けます)。 )

8
user5038135

簡単な方法は:

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

Python 3.8からは、 prod 関数が標準ライブラリのmathモジュールに含まれています。

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

これはstartの値(デフォルト:1)と反復可能な数値の積を返します。

import math

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

イテラブルが空の場合、これは1(または提供されていればstartの値)を生成します。

2
Xavier Guihot

今日この質問を見つけました、しかし私はそれがリストの中に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
Xxxo
nums = str(Tuple([1,2,3]))
mul_nums = nums.replace(',','*')
print(eval(mul_nums))
2
M. Dickson

これは私のコードです:

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)

1
jackim

私はこれを次のようにお願いします。

    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
Shakti Nandan

Numpyには、リストの積を返すprod関数があります。この場合は、numpyから、技術的には特定の軸上の配列の積です。

一方通行:

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

もう1つはインポート方法で再生されます。

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

私の解決策:

def multiply(numbers):
    a = 1
    for num in numbers:
        a *= num
        return a

  pass
0
Dorian Vanzant