34

私はPythonのドキュメントを読んでPython言語を深く理解し、フィルターとマップ機能に出くわしました。SO のさまざまな Python の質問で両方を見たことがありますが、以前はフィルターを使用していましたが、マップしたことはありません。

Python チュートリアルでそれらについて読んだ後、私は 2 つの違いについて混乱しています。たとえば、5.1.3 から。関数型プログラミング ツール:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

>>> def cube(x): return x*x*x
...
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

これらは機能的にはほぼ同じに見えたので、ターミナルに入って対話的に Python を実行し、自分のケースをテストしました。map上記の 1 番目と 2 番目のインスタンスの両方で使用しましたが、最初のインスタンス ( return x % 2 != 0 and x % 3 != 0) では、数値ではなくブール値のリストが返されました。

mapブール値を返す場合と実際の戻り値を返す場合があるのはなぜですか?

誰かが と の違いを正確に説明できますmapfilter?

4

5 に答える 5

38
list(map(cube, range(1, 11)))

と同等です

[cube(1), cube(2), ..., cube(10)]

によって返されるリスト

list(filter(f, range(2, 25)))

result実行後と同等

result = []
for i in range(2, 25):
    if f(i):
        result.append(i)

mapを使用する場合、結果の項目は関数によって返される値であることに注意してくださいcube

対照的に、 で返される値はの項目ではありませfん。に値を保持する必要があるかどうかを判断するためにのみ使用されます。filter(f, ...)resultf(i)iresult


Python2 では、リストmapfilter返します。Python3 では、反復子mapfilter返します。上記でlist(map(...))list(filter(...))、結果がリストであることを確認するために使用されます。

于 2013-09-22T02:13:42.590 に答える
26

filter()は、その名前が示すように、元の iterable をフィルター処理し、 にTrue提供された関数に対して返される項目を保持しますfilter()

map()一方、提供された関数を iterable の各要素に適用し、各要素の結果のリストを返します。

あなたが与えた例に従ってください、それらを比較しましょう:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> range(11)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> map(f, range(11))  # the ones that returns TRUE are 1, 5 and 7
[False, True, False, False, False, True, False, True, False, False, False]
>>> filter(f, range(11))  # So, filter returns 1, 5 and 7
[1, 5, 7]
于 2013-09-22T02:17:53.077 に答える