2016-03-29 17 views
-1

Temelde ne istediğiniz iki diziler çok değişkenli parametre olarak math.functions bir dizi iletin

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

Ve yöntemi içinde

alan bir yöntem ilk fonksiyonunda x gibi dizi1 ilk elemanını kullanır dizi1, dizi2'nin ikinci elemanı, dizi2'nin ikinci işlevindeki x gibi ve bu şekilde devam eder.

def cal(array1, array2): 

Ben stackoverflow ve lambda kullanarak veya yöntemi çağırmak için bir işlev kullanıyordum var kapanmadan bakarak, ama bunların hiçbiri sorunumu çözdü.

cevap

1

Bu listenin listesini döndüren bir liste anlama, şöyle

istediğiniz söylediklerini tam anlamıyla yapar:

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

Çıktı:

[1.0, 6.0, 9] 
+0

Tam olarak aradığım şey bu, teşekkürler! – cadv

+0

@martineau Çok merak ettim, fonksiyonların dizeler olarak kaydedildiğini ve bu yüzden bir değerlendirmeye ihtiyaç duyduğunuzu nasıl anladınız? –

+1

@mu 無: Örnek bir kodun bir dizi ifade göstermesine rağmen, bir dizi işlevin iletilmesinden söz edilen başlığın adı, bu yüzden bunları temsil etmenin en basit yolunu seçtim ve onları farklı bağlamlarda seçtim. gerçekten de - artı başka bir şey çalışmak için daha fazla iskele gerekli olurdu ('lamda's veya sınıf yöntemleri kullanarak gibi). – martineau

3

Sen python lambda functions arıyoruz: Temelde

>>> 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] 

yerleşik map kullanarak tüm dizi1 değerleri için, fonksiyonlar her bir diziye içinde çağrılabilir lambda olarak saklanır ve daha sonra işlevlerin her denir . Aynı endeksine dayalı her öğenin fonksiyonlarını uygulamak isterseniz

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

, şunları kullanabilirsiniz:

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

Teşekkür @mu I, eksik olduğum kısım, mapin. Aynı şeyi yapan, ancak tüm listeyi geçmek yerine yinelenemez bir parametre kullanan yerleşik bir işlev biliyor musunuz? I ' , n = 0 dizisiyle istenen bir çıkış elde etmek için = [] dizi2 fonksiyon için: new_array = harita (fonksiyon, Dizi1) array.append (new_array [n]) , n = n + 1 ' Ancak, kaynak israfıdır. – cadv

+0

@cadv Seni tamamen anladım mı emin değilim. Bildiğim kadarıyla, harita işlevi bunu yapmak için normal yoldur; güncellenmiş cevapta olduğu gibi kümülatif sonucu elde etmek için liste kavramasını kullanabilirsiniz. Aynı dizine dayalı fonksiyonlar uygulamak istiyorsanız, zip'e bir göz atın. –

İlgili konular