【发布时间】:2014-12-21 09:33:09
【问题描述】:
假设您在列表上调用“过滤器”函数,并使用它来查找满足特定属性的所有元素。输出列表中的元素是否保证与输入列表中的元素顺序相同?
【问题讨论】:
假设您在列表上调用“过滤器”函数,并使用它来查找满足特定属性的所有元素。输出列表中的元素是否保证与输入列表中的元素顺序相同?
【问题讨论】:
简单的答案是肯定的。列表是有序的可迭代对象,filter 生成器以该顺序一次读取每个项目。因此,它将按顺序产生输出。
>>> example = list(range(10))
>>> list(filter(lambda n: n % 2, example))
[1, 3, 5, 7, 9]
【讨论】:
collections.abcs.Sequence的东西。
range这样的迭代器,因为我们一次没有完整的东西在内存中。
从docs 到filter:
注意
filter(function, iterable)等价于生成器表达式(item for item in iterable if function(item))
由于等价的生成器表达式会保留顺序,filter 也保证会保留它。
【讨论】:
filter、生成器表达式、列表推导等依赖于对象的__iter__ 方法,如果对象的顺序像例如list 或 tuple。