web-dev-qa-db-ja.com

Python3のフィルター

Pythonのフィルターの概念を学んでいます。このような単純なコードを実行しています。

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))

しかし、リストを取得する代わりに、このようなメッセージが表示されます。

<filter object at 0x00FDC550>

これは何を意味するのでしょうか?それは、フィルタリングされたオブジェクト、つまり出てくるリストがそのメモリの場所に保存されているということですか?必要なリストを取得するにはどうすればよいですか?

102
user1190882

python 3.xを使用しているようです。 python3では、filtermapZipなどは、反復可能であるがリストではないオブジェクトを返します。言い換えると、

filter(func,data) #python 2.x

以下と同等です:

list(filter(func,data)) #python 3.x

あなたは(多くの場合)怠filteringな意味でフィルタリングをしたいので変更されたと思う繰り返し中に。

リストの内包表記とジェネレータ式に精通している場合、上記のフィルターは(ほぼ)python3.xの次のフィルターと同等です。

( x for x in data if func(x) ) 

とは対照的に:

[ x for x in data if func(x) ]

python 2.x

162
mgilson

フィルター 関数によって返される イテレーター です。

リストが必要な場合は、

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

それでも、forループを使用してこのオブジェクトを反復処理できます。

for e in filter(f, range(2, 25)):
    do_stuff(e)
19
sloth