2016-07-27 4 views
0

Pythonには、次の例のようにいくつかの条件で目的の出力をフィルタリングするフィルタメソッドがあります。フィルタリングはどのようにしてPythonで動作しますか?

>>> s = "some\x00string. with\x15 funny characters" 
>>> import string 
>>> printable = set(string.printable) 
>>> filter(lambda x: x in printable, s) 
'somestring. with funny characters' 

例はlinkから取られます。今、私がPython IDEで同様のことをしようとしているときには、'somestring. with funny characters'という結果を返します。それはthisを返します。<filter object at 0x0000020E1792EC50>。 IDEでは、単純なEnterキーを使用することはできません。そのため、このコード全体をフィルタリングして実行しています。私が間違っているところは?ありがとう。

答えて

2

に類似のpython 2上の行動を保つためにあなたが代わりにあなたがitertoolsモジュールを使用することができ、知っている必要があります発電機(docsを参照)

あなたはそのため通常は、その内容を表示するには、リストにこれを変換したい、またはあなたのケースでは、文字列:

>>> s = "some\x00string. with\x15 funny characters" 
>>> import string 
>>> printable = set(string.printable) 
>>> f = filter(lambda x: x in printable, s) 
>>> ''.join(f) 
'somestring. with funny characters' 

イテレータであるfilterの利点は、メモリの使用量がはるかに少ないことです。リストのように簡単にループすることもできます。

2

python 2.xフィルタでは新しいリストが返されますが、python 3.xではフィルタオブジェクト(ジェネレータ)が返されます。結果を確認したい場合はlist(yourobject)を呼び出してリストに変換してください。

(発電機など)のpython 3バージョンがlazilyを動作することのpython3フィルタ戻ってのpython 3

>>> list(itertools.ifilter(lambda x: x > 5, xrange(20))) 
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
+1

実際にはpython2の 'filter'特殊なケースの文字列!さもなければ 'filter(lambda x:True、" abc ")の結果は' ['a'、 'b'、 'c'] 'になりますが、実際には' abc'です。 – Bakuriu

+0

正しいことを期して、Python 2でフィルタリングすると、リスト、タプル、または文字列を返すことができます。 –

+0

@BurhanKhalidそうではありません。特別な場合は 'tuple'と' str'です。たとえば 'filter(lambda x:True、{1,2,3})== [1,2,3]'のように 'set'は' list'sに変換されます。また、 'namedtuple'を持っていれば、それは普通の' tuple'などに変換されます。 – Bakuriu

関連する問題