2017-12-21 1 views
0

mapを使ってリストの要素を合計することができるのだろうかと思っていた。mapを使ってリストの要素を合計する

int object is not iterableというリストが反復可能オブジェクトを望んでいるため、エラーになります

list(map(sum, a))a = [1, 2, 3, 4]を前提としています。

map(sum, a)は有効なステートメントですが、オブジェクトを指定すると、逆参照する簡単な方法はありません。

[map(sum, a)]

this答えは、それは簡単なはずと述べているリスト内のオブジェクトを返します。私はここで何が欠けていますか?

+7

'sum(a)'の何が問題なのですか? 'map'は、リストに要素的に関数を適用したいときに使われます。 'sum'は繰り返し可能です。単一の数字に 'sum'を適用すると(マップのように)無意味です。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ、何も、単に可能性を持って遊んでいます。 – Adorn

+1

また、リンクされた回答は 'map' +' sum'が適用されるリストのリストを扱います。一方、あなたは数字のリストを持っています。 –

答えて

6
x = list(map(sum,a)) 

は、合計が合計を全体に適用するために反復可能を必要

x = [] 
for i in a: 
    x.append(sum(i)) 

に相当します。ドキュメントの構文が表示される場合は、このようになりますsum(iterable[, start])intは反復可能ではないので、そのエラーが発生します。

+2

'map'がジェネレータを返すので、正確には同等ではありません。 – Gino

+0

@Ginoは 'sum(int) 'が何をするかを理解するための簡単な表現です。空のリストまたはリストの理解にデータを追加する必要があります。 mapはイテレーター関数です。 – Dark

2

mapは、リスト内のすべての要素に関数を適用します。代わりに、あなたはreduceを使用することができます。

a = [1, 2, 3, 4] 
sum_a = reduce(lambda x, y:x+y, a) 

をこの場合には、純粋にsumが、しかし、より機能的にするために使用することができ、reduceは良いオプションです。

か、のpython3で:

from functools import reduce 
a = [1, 2, 3, 4] 
sum_a = reduce(lambda x, y:x+y, a) 
0

エラーint object is not iterableは、listがイテラブルを期待しているが、sumがイテラブルを期待しているためではありません。 次のコード:最後の式を実行すると、同じエラーが生成さ

[sum(x) for x in [1,2,3,4]] 

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

はとやや同等です。

+0

https://stackoverflow.com/a/47927302/4909087正確なことを述べてください。 –

2

もちろん、リストの要素を合計したい場合は、単にsum(list_)を呼び出す必要があります。

質問:mapで、Pythonの組み込みとパターンの両方は、データシーケンスに関数を適用することを指し、最初のシーケンスの各要素について別々の結果を持つ別のシーケンスを生成します。

sumこのようにしないと、シーケンス全体で単一の結果が得られます。このパターンはreduceと呼ばれており、これを行うためのPythonも組み込まれています。 Python 3では、それはfunctoolsモジュールに「降格」されました。これは、マップパターンよりもセルドンが使用されたためです。

sumビルトイン自身が一人で、「減らす」パターンを採用 - あなたは明示的にそれが行くパターンを減らす使用してsumを再作成した場合は同様:

from functools import reduce 
a = [1, 2, 3, 4] 
reduce(lambda result, value: result + value, a, 0) 

は、最初のパラメータはかかる呼び出し可能です「今までの累積結果」、2番目の値はreduce atで実行したい項目のシーケンス、3番目のパラメータは累積結果として渡す初期値です。 (したがって、ゼロから始まります)。被乗数の場合、次のように使用できます。

reduce(lambda result, value: result * value, a, 1) 
関連する問題