2012-10-21 6 views
6

リストの要素をまとめてペアにして、最終的なオブジェクトを作成しようとしています。これはオブジェクトの合計と似ています。私はreduceの単純なバリエーションを使用しようとしています。ここでは、これを行うためのフラットリストではなく、ペアのリストを検討します。私は数字numsのリストの各要素に固有の合計に追加情報を追加したい除いPythonを使ってペアのリストを減らす

nums = [1, 2, 3] 
reduce(lambda x, y: x + y, nums) 

:私はの線に沿って何かをしたいです。各ペアについて例えば(a、b)は、リスト内の、合計を実行するように(A + B):

nums = [(1, 0), (2, 5), (3, 10)] 
reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 

これは動作しません:

>>> reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
TypeError: 'int' object is unsubscriptable 

なぜそれは動作しませんか?私はnumsをフラットなリストとしてエンコードすることができることを知っています - それはポイントではありません - 私はちょうどペアのリストを繰り返したり、同じ長さの2つのリストを同時に反復できるreduce操作を作成し、両方のリスト。ありがとう。

+0

はあなたがタプルであることを減らすの結果をしたいですか? –

+0

reduceを使用する必要はありますか?私は単純な方が好きです sum(num [x]のxは[0] + x [1]) – cerealy

答えて

6

あなたはreduceに渡されたラムダを見る:fによって返された値がfの別の呼び出しにパラメータとして渡されます

f = lambda x, y: (x[0]+x[1]) + (y[0]+y[1]) 

。しかし、fはそのパラメータがペアであると予測しますが、返す値はintです。この関数をペアにも戻す必要があります。あなたは、累積値intを作ることができ、リスト要素ながら:あなたがすることができるもう一つは、リストの要素とは異なる累積値を扱うです

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), nums) 
(6, 15) 

:たとえば、これは別に左右を合計しますペアです。あなたがこれを行う場合は、アキュムレータがintに正しく初期化されるように、あなたは、reduceinitializer引数を渡す必要があります。

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda acc, y: acc + y[0] + y[1], nums, 0) 
21 
+0

ペアでreduceからイテレータを取得する方法はありますか?リストの 'enumerate(mylist)'に類似したもの。現在の要素だけでなく、リスト内の位置も返します。上の例で使用されているペアの数に 'reduce 'の' lambda'がアクセスできるか? – user248237dfsf

+0

@ user248237 'reduce 'への入力として' enumerate(mylist) 'を使うことができます。 – interjay

関連する問題