2017-09-07 4 views
1

私は次のように私はreduceを使用した場合、私は、リストのリストの要素の和になるだろう印象の下にあった:あるリストのリストを集計するときに、PythonのreduceがTypeErrorを発生させるのはなぜですか?

TypeError: 'int' object has no attribute '__getitem__' 

何を:私はというエラーを取得するしかし

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

この場合は減らしてください。そして私が合計したい場合、forループを避ける最良の方法は何ですか?

答えて

2

あなたがそのよう減らす使用したい場合は、初期値を提供する必要があります:

>>> list_of_lists = [[1],[2],[3],[4],[5]] 
>>> reduce(lambda x, y: x+y[0], list_of_lists, 0) 
15 

をしかし、このためにreduceを使用しないでください。ただ、sumビルトインを使用します。

>>> sum(n for sublist in list_of_lists for n in sublist) 
15 
>>> sum(n for [n] in list_of_lists) # enforcing 1-element sublists 
15 
0

サブリストにすべてをスローする理由はありません。これは本当にあなたが行っているものです。

reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 

リストの要素を合計するだけの場合、Pythonにはそのための組み込み関数があります。

sum([1, 2, 3, 4, 5]) 

実際にリストのリストが必要な理由がある場合は、累積値もリストにする必要があります。これを次のように考えてください:reduceに渡す関数は、最初の引数として後で渡されるため、通常は最初の引数として同じ型の値(ここでは "型"を非常にゆるやかに使用します)を返すべきです別のコールに転送します。

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

私は数字のリストのリストに私の問題を単純化しますが、ええ、私はその形式で仕事をしていました。 1つはリストとしての削減を節約することができます... – Yesh

関連する問題