Python中filter()之后的Reduce()?

时间:2017-09-28 07:11:24

标签: python apache-spark filter bigdata reduce

我对python中的两个函数有疑问:reduce()和filter()。 我们可以在filter()之后使用reduce()吗?

我在sklearn中使用了波士顿数据集。

x = load_boston()
x_target = x.target
xx = filter(lambda x: x > 20, x_target)

它工作正常。 接下来我想使用reduce()函数来总结xx中的值。

from functools import reduce
xxx = reduce(lambda x,y: x+y, xx)

我收到了错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-64-062fcc861672> in <module>()
      1 from functools import reduce
----> 2 xxx = reduce(lambda x,y: x+y, xx)

TypeError: reduce() of empty sequence with no initial value

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

是的,您可以使用filter()中的reduce()对象:

>>> from functools import reduce
>>> values = range(10, 30)
>>> filtered = filter(lambda x: x > 20, values)
>>> reduce(lambda x, y: x + y, filtered)
225

但是,filter()对象是迭代器;它将按需生成过滤值,当它到达终点时不会产生任何其他。因此,在将其传递给reduce()之前,您需要确保不要清空它:

>>> filtered = filter(lambda x: x > 20, values)
>>> filtered
<filter object at 0x10ee64ac8>
>>> list(filtered)
[21, 22, 23, 24, 25, 26, 27, 28, 29]
>>> reduce(lambda x, y: x + y, filtered)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: reduce() of empty sequence with no initial value

当您需要在多个位置重复使用时,重新创建filter()对象。

答案 1 :(得分:0)

这意味着过滤器函数会在列表中返回一个空列表。这里有一个例子:

sample = [2,3,4,5,6,7,8]
filter(lambda x: x%2 == 0, sample)
>>> [2, 4, 6, 8]
reduce(lambda x,y: x+y, filter(lambda x: x%2 == 0, sample))
>>> 20

所以,你的代码应该可行。

这是python 2.7。在python 3 +中应该有所不同

编辑:使用python3

 from functools import reduce
 sample = [2,3,4,5,6,7,8]
 f = filter(lambda x: x%2 == 0, sample)
 reduce(lambda x,y: x+y, f)
 >>> 20

以同样的方式工作; )