假设我想计算List中每个元素的平方根的乘积。 在Java中也可以实现同样的目标
import java.util.ArrayList;
public class App {
public static void main(String[] args) {
ArrayList<Double> arrays = new ArrayList<>();
arrays.add(4.0);
arrays.add(9.0);
arrays.add(16.0);
double i = arrays.stream().reduce(1.0, (a, b) -> (a * Math.sqrt(b)),
(a, b) -> (a * b));
System.out.println(i);
};
}
输出:
24.0
我如何在Python中实现同样的目标。下面给出错误。
>>> reduce(lambda a,b: math.sqrt(a)*math.sqrt(b), [4,9,16])
9.797958971132712
因为它相当于
>>> math.sqrt(math.sqrt(4)*math.sqrt(9))*math.sqrt(16)
然而,Java中的相同语法给出了不同的结果。它是如何计算的?
double i = arrays.stream().reduce(1.0, (a, b) -> (Math.sqrt(a) * Math.sqrt(b)));
输出:
8.23906857562847
答案 0 :(得分:3)
你需要提供初始值来实现与java中相同的逻辑,这里第一个参数 x 充当累积值,由1初始化:
from functools import reduce
from math import sqrt
reduce(lambda x, y: x * sqrt(y), [4,9,16], 1)
# 24.0
如果您没有提供初始值,它将从序列中的第一个元素开始。
使用初始值,这应该等同于上一个java示例:
reduce(lambda x, y: sqrt(x) * sqrt(y), [4,9,16], 1)
# 8.23906857562847