数値のリストを受け取り、それらを乗算する関数を作成する必要があります。例:
[1,2,3,4,5,6]
私にくれ1*2*3*4*5*6
ます。私は本当にあなたの助けを使うことができました。
数値のリストを受け取り、それらを乗算する関数を作成する必要があります。例:
[1,2,3,4,5,6]
私にくれ1*2*3*4*5*6
ます。私は本当にあなたの助けを使うことができました。
回答:
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
lambda
、平均.02s / 1000回の繰り返しをoperator.mul
とりましたが、平均.009s / 1000繰り返しを取り、operator.mul
桁違いに速くなりました。
operator.mul
C.へ直進
math.prod([1,2,3,4,5,6])
。(コースのインポートが必要)
以下を使用できます。
import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)
説明については、reduce
およびoperator.mul
ドキュメントを参照してください。
import functools
Python 3以降の行が必要です。
reduce()
関数がグローバル名前空間から削除され、functools
モジュールに配置されていることに注意してください。だからpython3ではあなたは言う必要がありますfrom functools import reduce
。
を使用しnumpy.prod
てタスクを実行します。下記参照。
import numpy as np
mylist = [1, 2, 3, 4, 5, 6]
result = np.prod(np.array(mylist))
result = np.prod(mylist)
numpy.int32
上記のように )2小さなリストではnumpyのがしばしば繰り返した場合、配列(関連を割り当てる必要があるので、これは、大幅に遅くなります)
np.prod(np.array(range(1,21)))
reduce
。
インポートを避け、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
ここに私のマシンからのいくつかのパフォーマンス測定があります。これが長時間実行ループの小さな入力に対して実行される場合に関連します。
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のオーバーフローにも注意してください。
multiply_functools
とは、multiply_numpy
ルックアップすることによって圧迫されnp
、functools
およびoperator
属性の検索に続いて、グローバルを。地元の人に切り替えてもらえませんか?_reduce=functools.reduce,
_mul = operator.mul`(関数のシグネチャreturn _reduce(_mul, iterable)
、本文など)
np.prod()
オプションの開始は100要素以上で最速になります。
個人的には、ジェネリックリストのすべての要素を一緒に乗算する関数が好きです。
def multiply(n):
total = 1
for i in range(0, len(n)):
total *= n[i]
print total
それはコンパクトで、単純なもの(変数とforループ)を使用し、私には直感的に感じます(問題をどのように考え、1つ取り、それを乗算し、次に次のように乗算するなど)。 )
for i in n:
、なぜtotal *= i
ですか?それははるかに簡単ではないでしょうか?
nums = str(tuple([1,2,3]))
mul_nums = nums.replace(',','*')
print(eval(mul_nums))
*
に置き換え、evalはこれを乗法として認識します。これのパフォーマンスは、特に他のソリューションと比較して
私はこれを次のようにしたいと思います:
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
私の解決策:
def multiply(numbers):
a = 1
for num in numbers:
a *= num
return a
pass
'' 'ループのロジック使用を理解する唯一の簡単な方法' ''
Lap = [2,5,7,7,9] x = 1 for i in Lap:x = i * x print(x)
何もインポートしないのはとても簡単です。これは私のコードです。これは、リスト内のすべてのアイテムを乗算してそれらの積を返す関数を定義します。
def myfunc(lst):
multi=1
for product in lst:
multi*=product
return product