大家好,我试图编写使用函数列表和整数列表的代码,而仅返回在函数列表中至少具有1 true的代码,如下所示:
tuple(lambda func,data:filter(lambda x:map(lambda y:y(x)==true,func),data))
func=(lambda x: x>3,lambda x: x%2==0)
data=(1,2,3,4,5,6,7,8,9,10)
所以列表应该返回 4,6,8,10 而是返回整个列表,有人知道为什么吗?
P.S我知道可以很容易地以不同的方式来完成它,但这是一个lambda练习。
答案 0 :(得分:1)
您可以使用如下表达式:
tuple(filter(lambda x: any(filter(lambda f: f(x), func)), data))
所以
In [17]: func=(lambda x: x>3,lambda x: x%2==0)
...: data=(1,2,3,4,5,6,7,8,9,10)
...:
...:
In [18]: tuple(filter(lambda x: any(filter(lambda f: f(x), func)), data))
Out[18]: (2, 4, 5, 6, 7, 8, 9, 10)
还要注意,您的表达式会引发一个TypeError
,所以我不知道您对返回整个列表的意思。
使用类似以下内容的代码可能更易读:
In [23]: tuple(
...: x for x in data
...: if any(f(x) for f in func)
...: )
Out[23]: (2, 4, 5, 6, 7, 8, 9, 10)
或者没有any
(荒谬的约束)
In [29]: tuple(filter(lambda x: tuple(filter(None, map(lambda f: f(x), func))), data))
Out[29]: (2, 4, 5, 6, 7, 8, 9, 10)
答案 1 :(得分:0)
使用列表推导来映射这些函数更像Pythonic:
data = range(1, 11)
funcs = (lambda x: x > 3, lambda x: x % 2 == 0)
new_data = [x for x in l if all(f(x) for f in funcs)]
# new_data == [4, 6, 8, 10]