首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅使用一个条件进行过滤

仅使用一个条件进行过滤
EN

Stack Overflow用户
提问于 2018-12-11 07:41:15
回答 2查看 92关注 0票数 0

我正在尝试编写一个只使用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。这是我到目前为止的代码,我不知道该怎么做……

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-11 08:13:42

这就是它:

代码语言:javascript
复制
a = lambda func, data: tuple(filter(lambda d: (sum(map(lambda f: f(d), func)) == 1), data))

由于这真的只是一个人为的练习,因此我不会努力解释这个可怕的表达。但是实现它的方法是首先用for循环、if块等清晰地编写代码,然后一步一步地用适当的mapfilter等替换每个组件。

我在这里使用的一个技巧是自动将布尔值转换为int:sum(sequence_of_bool) == 1表示恰好有一个布尔值为True

我的完整测试代码:

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-12-11 08:25:45

您可以使用bool.__xor__来确保只满足func元组中的两个函数中的一个:

代码语言:javascript
复制
from functools import reduce
tuple(filter(lambda x: reduce(bool.__xor__, map(lambda f: f(x), func)), data))

这将返回:

代码语言:javascript
复制
(2, 5, 7, 9)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53715351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档