list1= [1,2,3,4]
1)24を出力するために、このリストのすべての要素を乗算したい。forループを使用せずにPythonでこれを行うにはどうすればよいですか?これを行うための組み込みライブラリはありますか?
2)そして、次のようlist1
な文字列が含まれている場合はどうなりますか
list1= ["1,2,3,4"]
3)そして、次のようlist1
な文字列が含まれている場合はどうなりますか
list1 = ['1234']
list1= [1,2,3,4]
1)24を出力するために、このリストのすべての要素を乗算したい。forループを使用せずにPythonでこれを行うにはどうすればよいですか?これを行うための組み込みライブラリはありますか?
2)そして、次のようlist1
な文字列が含まれている場合はどうなりますか
list1= ["1,2,3,4"]
3)そして、次のようlist1
な文字列が含まれている場合はどうなりますか
list1 = ['1234']
次のものも使用できます。
import operator
reduce(operator.mul, [1,2,3,4])
アウト:
24
パフォーマンスに関しては、使用operator.mul
はやや高速です。
In [1]: from operator import mul
In [2]: lst = [1,2,3,4]
In [3]: reduce(mul,lst)
Out[3]: 24
In [4]: %timeit reduce(mul,lst)
1000000 loops, best of 3: 733 ns per loop
In [5]: %timeit reduce(lambda x,y:x*y,lst)
1000000 loops, best of 3: 1.28 us per loop
数字を文字列として持っている場合:
In [6]: reduce(mul,map(int,["1,2,3,4"][0].split(',')))
Out[6]: 24
大きなリストの場合itertools.imap
は、イテレータを返すを使用することもできます。
In [7]: from itertools import imap
In [8]: %timeit reduce(mul,imap(int,["1,2,3,4"][0].split(',')*10000))
1 loops, best of 3: 264 ms per loop
編集: そしてうまくいけばあなたの最後の編集で:
In [18]: reduce(mul,map(int,['1234'][0]))
Out[18]: 24
reduce()
、またはfunctools.reduce()
py3xで使用できます。
In [4]: list1= [1,2,3,4]
In [5]: reduce(lambda x,y:x*y,list1)
Out[5]: 24
Python 3.3では、次を使用することもできますitertools.accumulate()
。
from itertools import islice,accumulate
list1= [1,2,3,4]
le=len(list1)
it=accumulate(list1,operator.mul)
print list(islice(it,le-1,le))[-1] #prints 24
編集:文字列の場合、最初にを使用して文字列を分割してから、返されたリストにstr.split(",")
適用する必要があります。int()
In [6]: list1= ["1,2,3,4"]
In [7]: reduce(operator.mul,map(int,list1[0].split(",")))
Out[7]: 24
以下は、ループなしの乗算の実装です (再帰と末尾再帰を使用)。
" A recursive implementation"
def mul_recursive(nos):
if len(nos) == 1:
return nos[0]
return nos[0] * mul_recursive(nos[1:])
" A tail recursive implementation"
def mul_tailrecursive(nos):
def multiply(nos,mul_so_far):
if len(nos) == 1:
return nos[0]*mul_so_far
return multiply(nos[1:],mul_so_far * nos[0])
return multiply(nos,1)
print mul_recursive([1,2,3,4,5])
print mul_tailrecursive([2,3,4])