6

mapandfilterはしばしばリスト内包表記と交換可能ですが、 andreduceほど簡単に交換することはできません(さらに、場合によっては、とにかく関数型構文を好む場合もあります)。ただし、引数自体を操作する必要がある場合は、構文の体操を行い、最終的には読みやすさを維持するために関数全体を作成する必要があります。mapfilter

map図の単体テストを単純にするために使用しますが、実際のユースケースはリスト内包表記として表現するのが難しい場合があることに注意してください。

私はそれを行うための2つの厄介な方法を見つけましたが、実際に使用するものは何もありません.

[afunc(*i) for i in aniter] == map(afunc, *zip(*aniter))
[afunc(*i) for i in aniter] == map(lambda i: apply(afunc, i), aniter)

これらの式の右辺を表現する簡潔でエレガントな方法はありますか?

4

1 に答える 1

11

あなたの生活を楽にするツールのitertoolsをチェックしてください。

たとえば、投稿したコードは既にitertools.starmap.

itertools.starmap(afunc, aniter)

ドキュメントから:

iterable から取得した引数を使用して関数を計算する反復子を作成します。引数パラメータがすでに単一の iterable からタプルにグループ化されている場合 (データは「事前に圧縮」されている)、imap() の代わりに使用されます。imap() と starmap() の違いは、function(a,b) と function(*c) の違いと同じです。に相当:

def starmap(function, iterable):
   # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
   for args in iterable:
       yield function(*args)

には他にもたくさんの機能が隠されてitertoolsいるので、ドキュメントを読んで他に使用できるものがあるかどうかを確認することをお勧めします。レシピセクションでは、で使用できる関数を使用しitertoolsてさまざまな問題を解決する方法も示します。正確な要件を解決するレシピが見つからない場合でも、提示されたアイデアのいくつかをインスピレーションの源として使用できる可能性があります.

于 2012-07-09T20:30:36.343 に答える