仅使用一个条件过滤

时间:2018-12-10 23:41:15

标签: python lambda filter

我正在尝试编写仅使用lambda,过滤,映射和归约(它是一个谜语)的代码,该代码接受整数元组和函数元组,并返回仅返回 为真:

作为一个例子,如果元组是(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),函数元组是(lambda x: x > 3, lambda x: x % 2 == 0),我应该得到一个看起来像[2, 5, 7, 9]的新元组,因为它们仅构成两个规则之一返回True。到目前为止,这是我的代码,我不知道该怎么做...

func = (lambda x: x > 3, lambda x: x % 2 == 0)
data = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

a = lambda func, data: tuple(filter(lambda x: tuple(filter(None, map(lambda f: f(x), func))), data))
print(a(func, data))

此代码仅返回适用于两个术语的整数,但我需要使其仅一个

2 个答案:

答案 0 :(得分:1)

这里是:

<TransitionGroup>

因为这真的只是一个人为设计的练习,所以我不会尽力解释这种可怕的表达方式。但是要达到这一目的,方法是首先使用a = lambda func, data: tuple(filter(lambda d: (sum(map(lambda f: f(d), func)) == 1), data)) 循环,for块等以清晰的方式编写代码,然后一次用适当的{替换每个组件{1}},if等...

我在这里使用的一个技巧是将布尔值自动转换为int:map意味着一个布尔值就是filter

我的完整测试代码:

sum(sequence_of_bool) == 1

答案 1 :(得分:0)

您可以使用bool.__xor__确保仅满足func元组中两个功能之一:

from functools import reduce
tuple(filter(lambda x: reduce(bool.__xor__, map(lambda f: f(x), func)), data))

这将返回:

(2, 5, 7, 9)