2016-04-30 91 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]])