2017-10-06 129 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()时,我解决了第三个元素的解压问题。 –