2017-10-17 84 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)