6

オブジェクトの合計を作成するのと似た方法で、リスト内の一連の要素を組み合わせて最終的なオブジェクトを作成しようとしています。reduceこれを行うために、フラットリストではなくペアのリストを検討する場所について、単純なバリエーションを使用しようとしています。私は次の行に沿って何かをしたい:

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

ただし、数値のリスト内の各要素に固有の合計に追加情報を追加したいと思います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操作を作成できるようにしたいだけですリスト。ありがとう。

4

1 に答える 1

6

渡したラムダを見るとreduce

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

によって返される値は、fの別の呼び出しにパラメータとして渡されますf。しかし、fそのパラメーターはペアであると予想されますが、返される値はint. この関数もペアを返すようにする必要があります。たとえば、これは左側と右側を別々に合計します。

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

他にできることは、累積値をリスト要素とは異なる方法で扱うことですint。リスト要素がペアである間に、累積値を にすることができます。これを行う場合、アキュムレータが に正しく初期化されるように、initializer引数をに渡す必要があります。reduceint

>>> nums = [(1, 0), (2, 5), (3, 10)]
>>> reduce(lambda acc, y: acc + y[0] + y[1], nums, 0)
21
于 2012-10-21T16:47:52.610 に答える