/ / Produits de racines carrées dans une liste utilisant `Réduire` - java, python, réduire

Produits de racines carrées dans une liste utilisant `Réduire` - java, python, réduire

Disons que je veux calculer le produit des racines carrées de chaque élément de la liste. La même chose peut être réalisée en Java comme

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);

};
}

Sortie:

24.0

Comment puis-je obtenir le même résultat en Python? Ci-dessous donne incorrect.

  >>> reduce(lambda a,b: math.sqrt(a)*math.sqrt(b), [4,9,16])
9.797958971132712

Comme cela équivaut à

>>> math.sqrt(math.sqrt(4)*math.sqrt(9))*math.sqrt(16)

Cependant, la même syntaxe en Java donne un résultat différent. Comment ça calcule ça?

double i = arrays.stream().reduce(1.0, (a, b) -> (Math.sqrt(a) * Math.sqrt(b)));

Sortie:

8.23906857562847

Réponses:

3 pour la réponse № 1

Vous devez fournir la valeur initiale pour implémenter la même logique qu'en Java, ici le premier paramètre X agit comme la valeur accumulée qui est initialisée par 1:

from functools import reduce
from math import sqrt

reduce(lambda x, y: x * sqrt(y), [4,9,16], 1)
# 24.0

Si vous ne fournissez pas la valeur initiale, elle commencera au premier élément de la séquence.

Avec la valeur initiale, cela devrait être équivalent à votre dernier exemple java:

reduce(lambda x, y: sqrt(x) * sqrt(y), [4,9,16], 1)
# 8.23906857562847