2016-07-27 60 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'事實上,它返回這個<filter object at 0x0000020E1792EC50>。在IDE中,我不能使用簡單的輸入,因此我在過濾時使用打印來運行整個代碼。我在哪裏做錯了?謝謝。

回答

2

行爲在python3過濾器返回發電機(見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)將其轉換成一個列表。

你必須知道的是,蟒蛇3版本(如發電機)的作品lazily,或者您可以使用itertools模塊繼續蟒蛇2類似蟒蛇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(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's被轉換爲'list's。另外如果你有一個'namedtuple',它將被轉換成一個普通的'tuple'等。 – Bakuriu