2017-09-27 88 views
0

鑑於以下兩個列表:循環執行列表的Python,索引(基本引導)

dates = [1,2,3,4,5] 
rates = [0.0154, 0.0169, 0.0179, 0.0187, 0.0194] 

我想生成一個列表 DF = []

長度相同的日期和價格的

( 0到4 = 5個元素)作爲練習在'純粹'Python(沒有Numpy)。

df[0] = (1/(1 + rates[0]) 
df[1] = (1 - df[0] * rates[1])/(1 + rates[1]) 
... 
df[4] = (1 - (df[0] + df[1]..+df[3])*rates[4])/(1 + rates[4]) 

我嘗試:

df = [] 
df.append(1 + rates[0]) #create df[0] 
for date in enumerate(dates, start = 1): 
    running_sum_vec = 0 
    for i in enumerate(rates, start = 1): 
     running_sum_vec += df[i] * rates[i] 
df[i] = (1 - running_sum_vec)/(1+ rates[i]) 
return df 

,但我得到的類型錯誤:列表索引必須是整數

DF [I]將等於。謝謝。

+0

你的指數是薄紗,因爲這就是枚舉產量。即使你沒有使用'x'變量,你也需要'爲idx,x在enumerate..'中 – Vinny

+0

你正在迭代你的'running_sum_vec + = df [i] * rates [i]'df'填充。結果值應該是多少? – bhansa

回答

1

因此,枚舉方法返回兩個值:食指和值

>>> x = ['a', 'b', 'a'] 
>>> for y_count, y in enumerate(x): 
...  print('index: {}, value: {}'.format(y_count, y)) 
... 
index: 0, value: a 
index: 1, value: b 
index: 2, value: a 
0

這是因爲for i in enumerate(rates, start = 1):enumerate生成索引和列表中的對象的元組。你應該這樣做

for i, rate in enumerate(rates, start=1): 
    running_sum_vec += df[i] * rate 

你需要修復的其他環路(for date in enumerate...)爲好。

您還需要將df[i] = (1 - running_sum_vec)/(1+ rates[i])移回到循環中(目前它只會設置最後一個值)(並將其更改爲append,因爲它目前會試圖設置索引超出範圍)。

0

枚舉返回索引和條目。 所以假設列表包含整數,你的代碼可以是:

df = [] 
df.append(1 + rates[0]) #create df[0] 
for date in dates: 
    running_sum_vec = 0 
    for i, rate in enumerate(rates[1:], start = 1): 
     running_sum_vec += df[i] * rate 
df[i] = (1 - running_sum_vec)/(1+ rate) 
return df 

雖然我幾乎可以肯定有一個與列表理解的方式。我必須考慮一下。

+1

它會顯示列表索引超出範圍錯誤。 – bhansa

+0

好點,錯過了 –

0

不知道這是否是你想要什麼:

df = [] 
sum = 0 

for ind, val in enumerate(dates): 
    df.append((1 - (sum * rates[ind]))/(1 + rates[ind])) 
    sum += df[ind]