2016-03-29 5 views
-1

Im Allgemeinen, was ich will, ist eine Methode, die zwei ArraysGeben ein Array von math.functions als Parameter mit mehreren Variablen

array1=[1, 2, 3] 
array2=[math.pow(x, 3), math.pow(x, 2)+x, 3*x] 

und innerhalb der Methode nimmt verwendet das erste Element der array1 als x in der ersten Funktion Array1, das zweite Element von Array2 als das x in der zweiten Funktion von Array2 und so weiter.

def cal(array1, array2): 

Ich habe gerade im Stackoverflow und schließt bekam ich wurde mit lambda oder einer Funktion mit der Methode nennen, aber keiner von ihnen mein Problem gelöst.

Antwort

1

Diese tut buchstäblich, was Sie sagen, Sie wollen:

import math 

array1 = [1, 2, 3] 
array2 = ['math.pow(x, 3)', 'math.pow(x, 2)+x', '3*x'] 

def cal(values, expressions): 
    return [eval(expression, {'math': math, '__builtins__': None}, {'x': value}) 
       for value, expression in zip(values, expressions)] 

print(cal(array1, array2)) 

Ausgang:

012.351.
+0

Dies ist genau das, was ich gesucht habe, danke! – cadv

+0

@martineau Ich bin sehr neugierig, wie hast du verstanden, dass die Funktionen als Strings gespeichert werden, und deshalb ein Eval benötigt wird? –

+1

@mu 無: Der Titel der Frage erwähnt das Übergeben eines Arrays von Funktionen, obwohl der Beispielcode ein Array von Ausdrücken zeigt, also wählte ich den einfachsten Weg, das Letztere darzustellen und sie in verschiedenen Kontexten auszuführen - was ich annahm, was sie sind wirklich gemeint - und alles andere hätte mehr Gerüste benötigt, um zu arbeiten (wie zum Beispiel mit 'Lamda's oder Klassenmethoden). – martineau

3

Sie suchen python lambda functions:

>>> import math 
>>> array1 = [1, 2, 3] 
>>> array2 = [lambda x: math.pow(x, 3), lambda x: math.pow(x, 2)+x, lambda x: 3*x] 
>>> for function in array2: 
...  print map(function, array1) 
... 
[1.0, 8.0, 27.0] 
[2.0, 6.0, 12.0] 
[3, 6, 9] 

Grundsätzlich werden die Funktionen jedes gespeicherte als aufrufbare Lambda innerhalb eines Arrays und dann jede der Funktionen wird für alle Werte von array1 genannt builtin map mit .

Als Liste Verständnis, die Liste der Liste zurück:

>>> [map(function, array1) for function in array2] 
[[1.0, 8.0, 27.0], [2.0, 6.0, 12.0], [3, 6, 9]] 

Wenn Sie die Funktionen jedes Element auf dem gleichen Index basiert anwenden möchten, können Sie verwenden:

>>> [y(x) for (x, y) in zip(array1, array2)] 
[1.0, 6.0, 9] 
+0

Dank @mu 無, der Teil, den ich vermisste, war die eingebaute 'map'. Kennen Sie eine eingebaute Funktion, die dasselbe tut, aber einen nicht-iterierbaren Parameter verwendet, anstatt die gesamte Liste zu durchlaufen? kann ich den gewünschten Ausgang mit ' n = 0 Array erhalten = [] für die Funktion in array2: new_array = map (Funktion, array1) array.append (new_array [n]) n = n + 1 ' ist jedoch eine Verschwendung von Ressourcen. – cadv

+0

@cadv Ich bin mir nicht sicher, ob ich dich vollständig verstanden habe. Soweit ich weiß, ist die Kartenfunktion der übliche Weg, dies zu tun; Sie könnten ein Listenverständnis verwenden, um das kumulative Ergebnis zu erhalten, wie in der aktualisierten Antwort. Wenn Sie nach Funktionen suchen, die auf demselben Index basieren, sehen Sie sich zip an. –