2016-04-30 106 views
1

我需要迭代兩個數字列表,這些數字構成函數的輸入。我想以功能性的方式做到這一點。目前我在做:無循環迭代參數

results = [] 
for i in params_list1: 
    for j in params_list2: 
     results.append(myfunction(i,j)) 

其中myfunction()返回一個數字。我很確定有一種方法可以將params_list1params_list2(可能使用numpy廣播?)相乘,並將它們映射到myfunction(),但我無法弄清楚。有小費嗎?

+2

能否請您發佈樣本_input_和_output_數據集(5-7行的CSV /字典/ JSON/Python代碼格式__as text__,所以人們可以在編碼時使用它),並描述你想如何處理輸入數據以獲得輸出數據集? [如何創建一個最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve) – MaxU

+0

我認爲OP正在尋求獲取和遍歷笛卡爾產品的方法。 – Quirk

+0

@MaxU我認爲* mcve *在 – styvane

回答

4

您可以使用itertools.product要做到這一點,你也應該考慮使用列表理解或map(如果你需要延遲計算),而不是使用使用list.append

results = [] 
for i, j in itertools.product(params_list1, params_list2): 
    results.append(myfunction(i, j)) 

或使用map這樣的:

result = map(function(i, j) for i, j in itertools.product(params_list1, params_list2)) 

您也可以使用*表達Python3.x解壓的參數的列表

result = [myfunction(*item) for item in itertools.product(params_list1, params_list2)] 
+0

ahh itertools.product想要做什麼。我在想numpy廣播,但是這個很有效! – ilanman

+0

@ilanman很高興得到了幫助! – styvane

+0

參數解包('f(* args,** kwargs)')也適用於Python 2.x –

-3

map(myfunction, params_list1,params_list2)

+2

這與'zip()'或者更糟。 OP需要笛卡爾產品。 – Quirk

+0

我誤解了這個問題。堆棧應用程序沒有刪除選項。 –

1

numpy的解決方案:

import numpy as np 

In [261]: a = np.array([0,1,2,3]) 

In [262]: b = np.array([2,3,4]) 

In [263]: 

In [263]: np.dstack(np.meshgrid(a, b)).reshape(-1, 2) 
Out[263]: 
array([[0, 2], 
     [1, 2], 
     [2, 2], 
     [3, 2], 
     [0, 3], 
     [1, 3], 
     [2, 3], 
     [3, 3], 
     [0, 4], 
     [1, 4], 
     [2, 4], 
     [3, 4]])