filter
用否定写 a 最惯用的方法是什么?
例子:
is_even= lambda x : x % 2 == 0
odd_numbers= filter( lambda x: not is_even(x), range(10) )
当然,您可以只使用列表推导式 - 但filter
无论如何您都不需要使用
万一有人想知道,我在尝试根据条件拆分列表时偶然发现了这一点
filter
用否定写 a 最惯用的方法是什么?
例子:
is_even= lambda x : x % 2 == 0
odd_numbers= filter( lambda x: not is_even(x), range(10) )
当然,您可以只使用列表推导式 - 但filter
无论如何您都不需要使用
万一有人想知道,我在尝试根据条件拆分列表时偶然发现了这一点
该itertools
模块包括ifilter()和ifilterfalse(),它们分别过滤函数返回True
和的元素False
。
odd_numbers = ifilterfalse(is_even, range(10))
filter
请注意,在 Python 2 中,和之间有区别ifilter
:odd_numbers
这里将是一个迭代器,而 filter() 将给出一个列表(请参阅itertools.ifilter Vs. filter Vs. list comprehensions)。如果您确实想构建一个列表,那么您的示例not
似乎很好,假设您已设置使用filter
- 列表推导可能更“惯用”(列表过滤:列表推导与 lambda + 过滤器)。
在 Python 3 中,filter()构造了一个迭代器,而不是一个列表,并且itertools.filterfalse()是补码。
基于谓词的拆分称为 a partition
。我会发现将其实现partition
为单独的函数而不是专门针对奇数和偶数重复其内部结构更为惯用。Python 3 的Itertools Recipes具有以下实现:
def partition(pred, iterable):
'Use a predicate to partition entries into false entries and true entries'
# partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9
t1, t2 = tee(iterable)
return filterfalse(pred, t1), filter(pred, t2)
它使用filterfalse
(如@Lack 所述)并tee
在该模块中定义。因此,您的最高级别代码如下所示:
odds, evens = partition(is_even, range(10))