【问题标题】:How does filtering work in Python? [duplicate]过滤在 Python 中是如何工作的? [复制]
【发布时间】: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,所以我在过滤时运行整个代码并打印。我在哪里做错了?谢谢。

【问题讨论】:

    标签: python python-3.x


    【解决方案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 等。
      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 2018-04-10
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 2023-02-06
      • 2012-11-19
      相关资源
      最近更新 更多