2012-02-28 8 views
27

semi-famous article written by Guido himselfreduce()がドードーの道を行くべきであり、言語を離れなければならないというヒントがあります。それはPython 3(instead getting stuffed in the functools module)のトップレベル関数から降格さえしました。reduce()のPythonの代替

多くの他の機能プログラミングステープル(マップなど)では、一般的な明確な選択肢があります。たとえば、ほとんどの場合、map()はリストの理解としてよく書かれています。

私が知りたいのは、reduce関数の代わりに「もっとpythonic」があることです。私は少しの機能プログラミングのバックグラウンド(特にML)を持っているので、解決策を考えるときにreduce()が頻繁に湧きますが、それを行うためのよりよい方法があれば(forループへの呼び出しを減らすことができません)知りたい。

+5

あなたはいつでも 'from functools import reduce'を実行できます。 –

+1

'reduce'、' fold'、 'map'などがあなたに合っていると思うなら、あなたの考え方を変えるべきではないと思います。あなたはすでに良い軌道に乗っています。 – Irfy

+0

@NiklasB:Functoolsからインポートできることは分かっています(そのことは私の質問で暗示されていました)。 –

答えて

23

Guidoのリンク記事によれば、reduce()を避けたい場合は、明示的なforループを書くだけです。あなたは減らす機能と同様、「より多くの神託」選択肢があるかどうか、私は知りたいのですがどのような

result = start 
for x in iterable: 
    result = function(result, x) 
+6

標準的なライブラリで定義されている 'reduce()'は、start引数を必要としません。それで、forループの周りにガードを置いて、iterableが空であるかどうかをチェックし、そうでなければ最初のアイテムを開始として残りのアイテムをループさせる必要があります。突然、1行の 'reduce()'はGuidoの考えにかかわらずさらに魅力的に見えます。 ;) –

+1

@AdamParkin:あなたの最後のコメントはあまり意味がありません。 2つのコードスニペットは100%相当です(実用的な目的で)。あなたは 'start'引数なしで' reduce() 'を呼び出すことができます。そしてそれと同等のものは違って見えますが、' reduce() 'を使うときに必要以上に空のiterablesを特別に扱う必要はありません。 「スタート」なし。 –

+1

'reduce(set.intersection、list_of_some_sets)'は、list_of_some_setsで定義されているすべての集合の交差点まで縮小します(暗黙的にリストの最初のeltを開始点として使用します)。これをループに展開するには、最初のelt(任意の要素)を「開始」として使用してから、残りのn-1要素を反復するループを入力する必要があります。しかし、リストから1番目(または何か)の項目を引っ張ることは、リストが空でないことが分かっている場合にのみ有効になります。したがって、ガードが必要です。私が意味することは、[docsの定義](http://docs.python.org/library/functions.html#reduce)を見てください。 –

1

によって

result = reduce(function, iterable, start) 

がある行を置き換えることができます。

はい、いいえ。ユースケースによって異なります。

リンクされた記事では、すべての縮小ではなく、ほとんどがループであると書かれています。適用されるとして彼がreduceを見る限られた状況があります。私の心の中でそう

は、削減の適用は、()、かなり 連想事業者に限定され、他のすべてのケースでは、明示的に に蓄積ループを書き出す方が良いでしょう。

多くの関連演算子はありません。 (それは の演算子Xであり、(a X b)X cはX(b X c)と等しい)。 はちょうど約+、*、&、|、^、および/またはショートカットに限定されていると思う。

+0

これは本当に質問に対する回答ではなく、むしろ質問に引用された記事に関連する(かなり良い)洞察ではありますが、大きなポイントと私は同意します。おそらく、これは提案された答えよりも質問に対するコメントとして適しているでしょうか? –

+1

@AdamParkinフェアポイント。答えとして書き直す。 – kkurian

+0

私のコードで 'reduce'を使うべきかどうかを決めるときに私は答えを見つけました。私の場合、私は非常に大きなリストから一意の値のセットに減らしています。だから、それが価値あるものであれば、あなたの連想演算子の集合に集合体を含めることができます。 – Rich