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中,我不能只使用简单的Enter,所以我在过滤时使用打印运行整个代码。我做错了什么?感谢。
答案 0 :(得分:2)
在python 2.x过滤器中返回一个新列表但是在python 3.x上它返回一个过滤器对象(生成器),如果你想看到结果只是调用list(yourobject)
来将它转换成一个列表。
你必须知道python 3版本(作为生成器)工作lazily,或者你可以使用itertools模块来保持python 2上的行为类似于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 :(得分: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
作为迭代器的好处是它使用的内存要少得多。它也可以很容易地循环,就像列表一样。