我正在尝试编写一个只使用lambda、filter、map和reduce (这是一个谜)的代码,它接受一个整数元组和一个函数元组,并返回一个新的整数元组,这些整数元组只返回函数列表中的一个 true:
举个例子,如果元组是(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))
这段代码只返回适用于这两个术语的整数,但我只需要将其转换为one。
发布于 2018-12-11 08:13:42
这就是它:
a = lambda func, data: tuple(filter(lambda d: (sum(map(lambda f: f(d), func)) == 1), data))
由于这真的只是一个人为的练习,因此我不会努力解释这个可怕的表达。但是实现它的方法是首先用for
循环、if
块等清晰地编写代码,然后一步一步地用适当的map
、filter
等替换每个组件。
我在这里使用的一个技巧是自动将布尔值转换为int:sum(sequence_of_bool) == 1
表示恰好有一个布尔值为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 d: (sum(map(lambda f: f(d), func)) == 1), data))
print(a(func, data))
(2, 5, 7, 9)
发布于 2018-12-11 08:25:45
您可以使用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)
https://stackoverflow.com/questions/53715351
复制相似问题