web-dev-qa-db-ja.com

Python:filter(function、sequence)とmap(function、sequence)の違い

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インタラクティブに実行し、自分のケースをテストしました。最初と2番目の両方にmapを使用しました上記のインスタンス、および最初のインスタンス(return x % 2 != 0 and x % 3 != 0)数値ではなくブール値のリストを返しました。

mapがブール値を返したり、実際の戻り値を返したりするのはなぜですか?

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

28
samrap
_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によって返される値であることに注意してください。

対照的に、ffilter(f, ...)で返す値は、resultのアイテムではありません。 f(i)ifを決定するためにのみ使用されます。値iresultに保持する必要があります。


Python2では、mapおよびfilterはリストを返します。 Python3では、mapおよびfilterはイテレータを返します。上記では、list(map(...))およびlist(filter(...))を使用して、結果がリストであることを確認しています。

34
unutbu

filter()は、その名前が示すように、元の反復可能オブジェクトをフィルタリングし、filter()に提供された関数のTrueを返すアイテムを保持します。

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

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

>>> 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]
23
CT Zhu

pythonのmap関数とfilter関数は、パフォーマンスが非常に異なるため、かなり異なります。簡単に例を挙げて、それらを区別してみましょう。

map関数

文字列引数を取る関数を定義して、それが母音文字シーケンスに存在するかどうかを確認してみましょう。

def lit(Word):
    return Word in 'aeiou'

次に、このためのマップ関数を作成し、ランダムな文字列を渡します。

for item in map(lit,['a','b','e']):
    print(item)

そして、はい、それは以下と同等です

lit('a') , lit('b') , lit('e')

単に印刷されます

True
False
True 

フィルター機能

ここで、filter関数を作成して、ランダムな文字列を渡します。

for item in filter(lit,['a','b','e']):
    print(item)

filterは、名前が示すように、元の反復可能オブジェクトをフィルター処理し、フィルター関数に提供された関数に対してTrueを返すアイテムを保持します。

単にそれが印刷されます

a
e

Fork it here 将来の参考のために、これが便利だと思ったら。

3
iNet

フィルター-真の値の位置を返します


var_list = [10,20,0,1]

var_b = list(filter(lambda var_a : var_a*2,var_list))

print("Values are",var_b)

出力


値は[10、20、1]です

Map-実際の結果を返します


var_list = [10,20,0,1]

var_b = list(map(lambda var_a : var_a*2,var_list))

print("Values are",var_b)

出力


値は[20、40、0、2]です

Reduce-リストの最初の2項目を取得し、関数を呼び出します。次の関数呼び出しでは、前の呼び出しの結果が最初の引数になり、リストの3番目の項目が2番目の引数になります


from functools import *

var_list = [10,20,0,1]

var_b = list(map(lambda var_a : var_a*2,var_list))

print("Values of var_b ",var_b)

var_c = reduce(lambda a,b:a*2,var_b)

print("Values of var_c",var_c)

出力


Var_bの値[20、40、0、2]

Var_c 160の値

1
Sivakumarj

Filter関数は、元のリストから結果をフィルタリングするために使用されますが、Map関数は、元のリストに関数を適用するために使用され、新しいリストが生成されます。フィルター関数を使用して、奇数の場合にのみリスト内の項目を返す以下の例を参照してください。リスト内の各アイテムの平方を返すために、マップ関数が以下で使用されています。

Lambda関数:Lambdaの使用:Lambda定義には「return」ステートメントが含まれていません。常に返される式が含まれています。ラムダ定義は、関数が必要な場所であればどこにでも置くことができ、変数に割り当てる必要はまったくありません。これはラムダ関数の単純さです。

g = lambda x: x*x*x 
print(g(5)) 
#125

Python=のfilter()関数は、関数とリストを引数として受け取ります。これは、関数がTrueを返すシーケンス「sequence」のすべての要素をフィルターで除外するエレガントな方法を提供します。以下は、入力リストから奇数を返す小さなプログラムです。

li = [4,5,7,8,9] 
final_list = list(filter(lambda x: (x%2 != 0) , li)) 
print(final_list)
#[5,7,9]

Python=のmap()関数は、関数とリストを引数として受け取ります。リストの各項目に関数を適用すると、新しいリストが返されます。

li = [5, 7, 4, 9] 
final_list = list(map(lambda x: x*x , li)) 
print(final_list)
#[25, 49, 16, 81]
0
Ashish Anand

filter(function、iterable)function(pointer、like in C)return boolean type

map(function、iterable)function(pointer、like in C)return e.g. int

def filterFunc(x):
    if x & 1 == 0:
        return False
    return True


def squareFunc(x):
    return x ** 2


def main():
    nums = [5, 2, 9, 4, 34, 23, 66]
    odds = list(filter(filterFunc, nums))   # filter(function, iterable)
    print(odds)

    square = list(map(squareFunc, nums))    # map(function, iterable)
    print(square)


if __name__ == '__main__':
    main()
0
andrew