这如何减少+ lambda列表过滤功能的工作原理?

时间:2016-09-11 05:59:58

标签: python lambda reduce

我看到以下代码将列表过滤为两个类:

reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49, 58, 76, 82, 88, 90],([],[]))

它是如何工作的? ([], [])看起来初始化lambda中的(a, b),但它是如何逐步工作的?

这似乎也不适用于Python 3.为什么会这样?

3 个答案:

答案 0 :(得分:1)

  

它是如何工作的? ([], [])看起来初始化lambda中的(a, b),但它是如何逐步工作的?

在每一点,reduce都会看到一个左手操作数(a, b),它是一对列表(最初是两个空列表)和一个元素c。它会将列表[c]添加到ab,具体取决于它是否大于60,并返回新的列表对。因此,它最终将返回大于60且小于60的元素对。

  

这似乎也不适用于Python 3.为什么会这样?

在Python3中,你不能再定义一个明确采用元组的函数 - tuple unpacking has been removed。所以

def foo((a, b)):
    ...

在Python3中是非法的。这也是问题所在(除了以lambda的形式)。

答案 1 :(得分:0)

要回答您的第一个查询,请使用for循环等效:

>>> c = [49, 58, 76, 82, 88, 90]
>>> final = ([], [])
>>> for val in c:
...     if val > 60:
...             final[0].append(val)
...     else:
...             final[1].append(val)
... 
>>> final
([76, 82, 88, 90], [49, 58])

python3中的等价物是:

In [8]: import functools

In [9]: functools.reduce(lambda x,c: (x[0]+[c],x[1]) if c > 60 else (x[0],x[1] + [c]), [49, 58, 76, 82, 88, 90],([],[]))
Out[9]: ([76, 82, 88, 90], [49, 58])

答案 2 :(得分:0)

看看以下实验:

>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49],([],[]))
([], [49])
>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49,58],([],[]))
([], [49, 58])
>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49,58,76],([],[]))
([76], [49, 58])
>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49,58,76,82],([],[]))
([76, 82], [49, 58])
>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49,58,76,82,88,90],([],[]))
([76, 82, 88, 90], [49, 58])

函数reduce描述如下:

reduce(...)
    reduce(function, sequence[, initial]) -> value

    Apply a function of two arguments cumulatively to the items of a sequence,
    from left to right, so as to reduce the sequence to a single value.

在我们的示例中,function是一个lambda函数,第一个参数为2元素元组(a,b),第二个参数为从列表中拾取的整数c进行处理。由于函数生成一个2元素的列表元组,因此它被初始化为([], [])。当处理开始时,如果元素是> 60,它被添加到元组的第一个列表中;否则它会被添加到元组的第二个列表中。

语法a+[c]实际上是列表的extend语法。我们无法执行a+c,因为a是一个列表,c是一个整数。同样,对于b+[c]