2012-09-07 4 views
70

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

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

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

<filter object at 0x00FDC550> 

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

答えて

118

python 3.xを使用しているようです。 python3では、filtermapzipなどは反復可能なオブジェクトを返しますが、リストは返しません。あなたは消費する必要はありません - 私はあなた(しばしば)は怠惰な意味でフィルタリングをしたいので、それが変更されたと思います

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

:他の言葉では、

filter(func,data) #python 2.x 

は同等ですイテレータが繰り返し中にリストと同じものを返す限り、すべてのメモリがリストを先頭に作成します。

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

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

とは対照的に:

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

in python 2.x

+0

ありがとうございます。また、この番号が何であるか教えてください。0x00FDC550 – user1190882

+3

それはオブジェクトのIDです。 CPythonでは、それはメモリの場所です。 – mgilson

+1

うわー...興味深い...私は[] snd list()は同等だと思ったが、[filter(func、data)]は同じに動作しない – user2846569

19

filter関数によって返されたiteratorです。

リストをしたい場合は、単にそれにもかかわらず、あなただけのforループでこのオブジェクトを反復処理することができます

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

を行います。

for e in filter(f, range(2, 25)): 
    do_stuff(e) 
+0

ありがとうございました。また、この番号が何であるか教えてください。0x00FDC550 – user1190882

+0

それはそのオブジェクトのメモリアドレスです。オブジェクトのクラスに['__repr__()']がない場合(http://docs.python.org/library/functions)、オブジェクトを印刷するときのデフォルトの出力です。html#repr)メソッドを使用して、出力を制御します。 – sloth