过滤如何在Python中工作?

问题描述:

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中,我不能使用简单的输入,因此我在过滤时使用打印来运行整个代码。我在哪里做错了?谢谢。

行为在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的好处是它使用的内存少得多。它也可以很容易地循环,就像列表一样。

在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