2012-03-15 1 views
4

私は整数の文字列を含むリストに対してpythons reduce関数を使用しようとしています。文字列を含むリストでreduce()とlambdaを使用しようとしています

print int("4") 
\\Gives me 4 Good 
print reduce(lambda x, y: x*y, [2, 3, 4]) 
\\Gives me 24 Good 
print reduce(lambda x, y: x*int(y), ['2', '3', '4']) 
\\Gives me 222222222222 What?? 

私はそのリスト内の実際の文字列ではありませんラムダ関数の何かを与えている減らすと仮定しますか?私は222222222222を少なくとも取得している理由を知りませんが、リストをintにする簡単な方法がありますか?私はもう一つのループができたと思うけど、文字列を渡すことに何が間違っているか知りたい。

+0

私はこの短い時間で非常に多くの回答を期待していませんでした。みんな助けてくれてありがとう。 新しいものについては、 'reduce(lambda x、y:x * int(y)、['2'、 '3'、 '4']、1)' from @ÓscarLópez –

答えて

7
>>> reduce(lambda x, y: x*int(y), ['2', '3', '4']) 
'222222222222' 

オーケーは、ここに何が起こるかです:

最初のステップを減らすには、次の計算が行われて:'2' * 3。最初のオペランドは文字列なので、単純に3回繰り返します。だから、'222'になります。

2番目の削減ステップでは、その値に4:'222' * 4を乗算します。繰り返しますが、文字列は4回繰り返され、結果は'222222222222'となります。

あなたが、または最初の場所で整数変換を使用してリスト要素をマッピングすることにより、どちらかが(int(x)を呼び出す)だけでなくint型にxを変換することによってこれを避けることができた(私は実際にそれがよりエレガントだと思う):

>>> reduce(lambda x, y: x * y, map(int, ['2', '3', '4'])) 
24 
+0

優れた答え、私は答えとしてこれを最も有益なものとしてマークしています。 –

1

文字列 '222'を与える​​int 3と、 '222222222222'という文字列を与えるint 4によって文字列 '222'を掛けます。あなたは整数にXを変換する必要が

print reduce(lambda x, y: int(x)*int(y), ['2', '3', '4']) 
0
multiply = lambda a,b: a*b 
listOfInts = map(int, ['2','3','4']) 

reduce(multiply, listOfInts) #output: 24 
+0

さらに良い: 'from演算子import mul as multiply' –

+0

@謝辞:ありがとう、私はそれを考えましたが、わかりやすく汎用性のために書きます。デフォルトの名前空間にあると期待される多くの関数をインポートする必要があることは悲惨です。 – ninjagecko

4

あなたはこの試みることができる:私はIND、reduceに三番目のパラメータを渡している

reduce(lambda x, y: x*int(y), ['2', '3', '4'], 1) 

お知らせ演算が1で初期化されるべきであることを示す、乗法的な同一性。このようにして、yの現在の値は、intxではなく、の値に変換されます。

+2

+1。それは確かにいい解決策です。説明を追加するには: 'reduce'呼び出しに渡された' 1'は、それをデフォルト/開始値にするので、最初のreduceステップは実際に '1 * int( '2')'です。 – poke

+1

答えがありがとう、私はこれが私にとって最も効率的であるように見えるので、これを使い終わった。 –

+1

@JustinEgliまた、中間のリストを作成しないので(mapと同じように)、最も効率的だと思います。 –