2017-10-17 85 views
0

我有一个包含列表的列表,每个列表代表一个公司,其中包含EBITDA值。现在,我想借此回报的日志,并创建一个具有使用所有日志返回一个新的列表:Python:将值添加到列表中,然后将此列表附加到列表中

ln(ebitda t/ebitda t-1) 

期望的结果将是保持每家公司的结果放在一起,像这样的列表内的列表:

[[0.69314718055994529, 0.40546510810816438, 0.28768207245178085], [0.18232155679395459, 0.15415067982725836, 0.13353139262452257]] 

但到目前为止,我得到:

[0.69314718055994529, 0.40546510810816438, 0.28768207245178085, 0.18232155679395459, 0.15415067982725836, 0.13353139262452257] 

我发现了一种对SO通过每个列表循环,使计算象下面这样:

from itertools import zip_longest 

import numpy as np 

l = [[1, 2, 3, 4], [5, 6, 7, 8]] 

logs = [] 
for num in l: 
    for x, y in zip_longest(num[1:], num[0:-1]): 
     logs.append(np.log((x/y))) 

但是,为了使结果可用,我需要能够让他们回到他们自己的名单,我不知道如何做到这一点。

感谢您的阅读和任何帮助表示赞赏。

+0

你的意思是通过让他们回到自己的名单? – gggg

+0

@gggg在我的代码中,最终的结果是所有的日志返回被合并成一个大列表。有了一个巨大的清单,没有简单的方法来计算每个公司的平均值或标准。我需要每个公司在他们自己的列表中的回报,现在可以与Adirio的代码一起使用。 –

回答

0

试试这个:

import numpy as np 

l = [[1, 2, 3, 4], [5, 6, 7, 8]] 

logs = [] 

for enterprise in l: 
    logs.append([]) 
    for i in range(1, len(enterprise)): 
     logs[-1].append(np.log(enterprise[i]/enterprise[i-1])) 
+0

谢谢,这似乎工作。为了我的理解,我们正在循环查看列表,为每个列表追加一个空列表,然后在列表中添加日志返回。这是对的吗? –

+0

对,这正是我们正在做的。由于我们需要以前的EBITDA值并且第一个元素没有以前的EBITDA,因此内部循环跳过了元素0(通过使用'range(1,...)'而不是'range(...)')。其余的是2个简单的循环。 – Adirio

0

这是你所拥有的一个更清洁的版本,但我不理解让他们回到自己的列出了声明。也许迭代l2是你想要的?

import numpy as np 

l = [[1, 2, 3, 4], [5, 6, 7, 8]] 
def f(num): 
     return [np.log(num[i+1]/float(num[i])) for i in xrange(len(num)-1)] 
l2 = [f(num) for num in l] 

for logren in l2: 
     print(logren)