使用map和函数列表遍历整数列表

时间:2018-12-10 19:41:31

标签: python lambda filter

大家好,我试图编写使用函数列表和整数列表的代码,而仅返回在函数列表中至少具有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练习。

2 个答案:

答案 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]