【问题标题】:Does filter preserve list ordering?过滤器是否保留列表排序?
【发布时间】:2014-12-21 09:33:09
【问题描述】:

假设您在列表上调用“过滤器”函数,并使用它来查找满足特定属性的所有元素。输出列表中的元素是否保证与输入列表中的元素顺序相同?

【问题讨论】:

    标签: python filter


    【解决方案1】:

    简单的答案是肯定的。列表是有序的可迭代对象,filter 生成器以该顺序一次读取每个项目。因此,它将按顺序产生输出。

    >>> example = list(range(10))
    >>> list(filter(lambda n: n % 2, example))
    [1, 3, 5, 7, 9]
    

    【讨论】:

    • 谢谢亚历克斯!哪些其他数据结构算作“有序迭代”?我知道哈希表可能不会。只有列表吗?
    • @Jessica Tuples、字符串、OrderedDict、队列、双端队列以及所有实现collections.abcs.Sequence的东西。
    • 列表、字符串、元组等。无序的包括字典或集合,它们是任意顺序的,或者像range这样的迭代器,因为我们一次没有完整的东西在内存中。
    • 谢谢,这很有帮助。
    【解决方案2】:

    docsfilter

    注意filter(function, iterable)等价于生成器表达式(item for item in iterable if function(item))

    由于等价的生成器表达式会保留顺序,filter 也保证会保留它。

    【讨论】:

    • 感谢您的快速回答!我查看了那些文档,但我不知道生成器是如何工作的,所以我没有意识到它们保留了顺序。
    • @Jessica 是的,这有点像兔子洞;最后,filter、生成器表达式、列表推导等依赖于对象的__iter__ 方法,如果对象的顺序像例如listtuple
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多