121

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

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

しかし、リストを取得する代わりに、このようなメッセージを取得しています。

<filter object at 0x00FDC550>

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

4

2 に答える 2

204

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

filter(func,data) #python 2.x

と同等です:

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

(多くの場合)怠惰な意味でフィルタリングを実行したいので、変更されたと思います-イテレータが同じものをリストに返す限り、リストを作成するためにすべてのメモリを消費する必要はありません反復中になります。

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

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

とは対照的に:

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

Python2.xで

于 2012-09-07T13:26:13.400 に答える
24

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

リストが必要な場合は、

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

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

for e in filter(f, range(2, 25)):
    do_stuff(e)
于 2012-09-07T13:26:27.503 に答える