过滤在 Python 中是如何工作的? [复制]

Posted

技术标签:

【中文标题】过滤在 Python 中是如何工作的? [复制]【英文标题】:How does filtering work in Python? [duplicate] 【发布时间】:2016-12-01 05:13:11 【问题描述】:

Python 有 filter 方法,可以根据某些标准过滤所需的输出,如下例所示。

>>> 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,所以我在过滤时运行整个代码并打印。我在哪里做错了?谢谢。

【问题讨论】:

【参考方案1】:

在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) 将其转换为列表。

您必须知道 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]

【讨论】:

其实在python2中filter特例字符串!否则filter(lambda x: True, "abc") 的结果将是['a', 'b', 'c'],但实际上是abc 正确地说,Python 2 中的过滤器返回可以返回列表、元组或字符串。 @BurhanKhalid 这不是真的。它是tuplestr 的特殊情况。但例如filter(lambda x: True, 1,2,3) == [1,2,3] 所以sets 被转换为lists。此外,如果您有 namedtuple,它将被转换为普通的 tuple 等。

以上是关于过滤在 Python 中是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

返回语句在 JavaScript 中是如何工作的? [复制]

MySQL 5.7在线设置复制过滤

这个符号在 C++ 中是啥意思? [复制]

元组比较在 Python 中是如何工作的?

JOIN 在 MySQL 中是如何工作的?

游标在 Python 的 DB-API 中是如何工作的?