过滤在 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 这不是真的。它是tuple
和str
的特殊情况。但例如filter(lambda x: True, 1,2,3) == [1,2,3]
所以set
s 被转换为list
s。此外,如果您有 namedtuple
,它将被转换为普通的 tuple
等。以上是关于过滤在 Python 中是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章