2017-10-06 130 views
-1

(這個問題可能與「循環使用字典迭代」有所不同,因爲我有多個鍵,每個鍵都有多個條目,並且還有問題指向正確的鍵)。KeyError通過循環遍歷每個鍵的多個值

有這個空字典:

import .math 

instruments = {} 

下面這個簡單的方法來填充它:

def add_instrument(par, T, coup, price, compounding_freq = 2): 
     instruments[T] = (par, coup, price, compounding_freq) 

add_instrument(100, 0.25, 0., 97.5) 
add_instrument(100, 0.5, 0., 94.9) 
add_instrument(100, 1.0, 3., 90.) 
add_instrument(100, 1.5, 8, 96., 2) 

如果我們檢查:

instruments.keys() 

我們得到:[0.25, 0.5, 1.5, 1.0]

我會那麼喜歡通過字典和if coup == 0環,做一些操作,否則做別的事情:

for T in instruments.items(): 
    (par, coupon, price, freq) = instruments[T] 
    if coupon == 0: 
      do_something 

但我得到一個#KeyError: (0.25, (100, 0.0, 97.5, 2))

任何想法,爲什麼和我應該如何重新安排循環? TIA。

編輯:使用下面的答案,BootstrapYieldCurve類按照計劃在「掌握財務的Python」一書中工作,ch5。

+0

'對於T在instruments.items():'應該是'爲T在instruments.keys()中:'或者只是'用於樂器中的T:' –

+0

當您在instruments.items()中更改'T'時:'to'爲T,_中的instruments.items():'也是,我相信你應該在你的add_instruments函數中寫入'global instruments'。 – SRC

回答

1

T是關鍵,所以你應該for T in instruments迭代:

import math 

instruments = {} 

def add_instrument(par, T, coup, price, compounding_freq = 2): 
    instruments[T] = (par, coup, price, compounding_freq) 

add_instrument(100, 0.25, 0., 97.5) 
add_instrument(100, 0.5, 0., 94.9) 
add_instrument(100, 1.0, 3., 90.) 
add_instrument(100, 1.5, 8, 96., 2) 

for T in instruments: 
    par, coupon, price, freq = instruments[T] 
    if coupon == 0: 
     print(T) 

如果使用for T in instruments.items()T成爲(key, value)的元組。當你再找instruments[T]時,字典中沒有這樣的密鑰。

你也可以拆開值元組直接,如果你堅持要用items()

for t, (par, coup, price, freq) in instruments.items(): 
    if coup == 0: 
     print(t) 

它輸出:

0.25 
0.5 
+0

謝謝埃裏克,這終於奏效了。事實上,當使用instruments.keys()而不是instrumetns.items()時,我解決了第三個元素的解壓問題。 –