将输出函数附加到多个列表

时间:2016-10-12 15:22:42

标签: python list python-2.7 append

我想用不同的参数值执行一个函数。我有以下代码片段,效果非常好:

tau = np.arange(2,4.01,0.1)
R = []
P = []
T = []
L = []
D = []
E = []
Obj = []
for i, tenum in enumerate(tau):
    [r, p, t, l, d, e, obj] = (foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01))
    R.append(r)
    P.append(p)
    T.append(t)
    L.append(l)
    D.append(d)
    E.append(e)
    Obj.append(obj)

但是,我想知道:有没有更简单的方法来实现这一目标?

我尝试过使用过 res.append(foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)res[1]返回<generator object <genexpr> at 0x046E7698>

2 个答案:

答案 0 :(得分:3)

tau = np.arange(2,4.01,0.1)
results = [[] for _ in range(7)]
for i, tenum in enumerate(tau):
    data = foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)
    for r,d in zip(results, data):
        r.append(d)
r, p, t, l, d, e, _obj = results

答案 1 :(得分:3)

您可以将生成器对象转换为列表对象,只需将其传递给list()函数,这样就可以做到你想要的了:

res = []
for i, tenum in enumerate(tau):
   res.append(list(foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)))

列表理解更短:

res = [list(foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)) for i, tenum in enumerate(tau)]

无论哪种方式,这都会使你的转置与你想要的相比(将其视为一个矩阵)。您可以通过调用zip来解决此问题:

res_tr = zip(*res)
R, P, T, L, D, E, Obj = res_tr

编辑:最短的是,您可以避免使用直接传递给zip()的生成器表达式构建中间列表:

R, P, T, L, D, E, Obj = zip(*(list(foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)) for tenum in tau))

最后一点:在所有这些中,您可以替换&#34; for i, tenum in enumerate(tau)&#34;用&#34; for tenum in tau&#34;因为你似乎没有使用i