2012-12-23 98 views
0

爲什麼此代碼無法正常工作?它爲key3返回一個關鍵錯誤。 adict擁有key3,除了我將它們在循環中彼此傳遞之外,它與我向空詞典添加鍵的方式似乎沒有什麼不同。如何將密鑰和值從一個字典傳遞到具有相同主鍵的新密鑰?將字典鍵傳遞給新詞典

adict = {'key1':{'a':.078, 'b':1000, 'c':100}, 
          'key2':{'a':.0645, 'b':10, 'c':5}, 
          'key3':{'a':.0871, 'b':250, 'c':45}, 
          'key4':{'a':.0842, 'b':200, 'c':37}, 
          'key5':{'a':.054, 'b':409, 'c':82}, 
          'key6':{'a':.055, 'b':350, 'c':60}} 

another_dict = {} 
for k in adict: 
    another_dict[k]['transferred'] = adict[k]['b'] 


>>> Traceback (most recent call last): 
     File "C:\Python27\test.py", line 26, in <module> 
     another_dict[k]['transferred'] = adict[k]['b'] 
     KeyError: 'key3' 

回答

1

使用another_dict[k]['transferred'],您試圖訪問'transferred'鍵的key k字典,這是尚未建立。

你可以在這裏使用defaultdict: -

from collections import defaultdict 
another_dict = defaultdict(dict) 

修改後的代碼: -

>>> from collections import defaultdict 
>>> adict = {'key1':{'a':.078, 'b':1000, 'c':100}, 
...       'key2':{'a':.0645, 'b':10, 'c':5}, 
...       'key3':{'a':.0871, 'b':250, 'c':45}, 
...       'key4':{'a':.0842, 'b':200, 'c':37}, 
...       'key5':{'a':.054, 'b':409, 'c':82}, 
...       'key6':{'a':.055, 'b':350, 'c':60}} 
... 
... another_dict = defaultdict(dict) 
... for k in adict: 
...  another_dict[k]['transferred'] = adict[k]['b'] 

>>> another_dict 
5: defaultdict(<type 'dict'>, {'key3': {'transferred': 250}, 
          'key2': {'transferred': 10}, 
          'key1': {'transferred': 1000}, 
          'key6': {'transferred': 350}, 
          'key5': {'transferred': 409}, 
          'key4': {'transferred': 200}}) 
+0

不要忘了'從收藏導入defaultdict' –

1

問題是another_dict[k]實際上還不存在和你想的東西,是做another_dict[k]['transferred']甚至沒有初始化。所以,你需要先初始化:

In [35]: adict = {'key1':{'a':.078, 'b':1000, 'c':100}, 
          'key2':{'a':.0645, 'b':10, 'c':5}, 
          'key3':{'a':.0871, 'b':250, 'c':45}, 
          'key4':{'a':.0842, 'b':200, 'c':37}, 
          'key5':{'a':.054, 'b':409, 'c':82}, 
          'key6':{'a':.055, 'b':350, 'c':60}} 

In [36]: another_dict={} 

In [37]: for k in adict: 
    another_dict[k]={}       #initialize another_dict[k] 
    another_dict[k]['transferred']=adict[k]['b'] 

In [38]: another_dict 
Out[38]: 
{'key1': {'transferred': 1000}, 
'key2': {'transferred': 10}, 
'key3': {'transferred': 250}, 
'key4': {'transferred': 200}, 
'key5': {'transferred': 409}, 
'key6': {'transferred': 350}} 
2

你必須創建一個新的字典,another_dict[k]訪問之前:

adict = {'key1':{'a':.078, 'b':1000, 'c':100}, 
         'key2':{'a':.0645, 'b':10, 'c':5}, 
         'key3':{'a':.0871, 'b':250, 'c':45}, 
         'key4':{'a':.0842, 'b':200, 'c':37}, 
         'key5':{'a':.054, 'b':409, 'c':82}, 
         'key6':{'a':.055, 'b':350, 'c':60}} 

another_dict = {} 
for k in adict: 
    if k not in another_dict: 
     another_dict[k] = {} 
    another_dict[k]['transferred'] = adict[k]['b'] 
2

如果我理解正確的話,這是相當簡單的使用dict理解:

>>> pprint({k:{'transferred':v['b']} for k, v in adict.iteritems()}) 
{'key1': {'transferred': 1000}, 
'key2': {'transferred': 10}, 
'key3': {'transferred': 250}, 
'key4': {'transferred': 200}, 
'key5': {'transferred': 409}, 
'key6': {'transferred': 350}} 

你也可以做一個方便的功能,只保留某些子鍵(如果它們要命名相同)

>>> from operator import itemgetter 
>>> def dict_with_subkeys(odict, *keys): 
    return {k:dict(zip(keys, itemgetter(*keys)(odict[k]))) for k in odict} 

>>> pprint(dict_with_subkeys(adict, 'a', 'c')) 
{'key1': {'a': 0.078, 'c': 100}, 
'key2': {'a': 0.0645, 'c': 5}, 
'key3': {'a': 0.0871, 'c': 45}, 
'key4': {'a': 0.0842, 'c': 37}, 
'key5': {'a': 0.054, 'c': 82}, 
'key6': {'a': 0.055, 'c': 60}} 
0

謝謝@ Ashwini我明白你的觀點。和@Jon。

正如我在Python和(?「字典解析」)獲得更好的,另一種解決方案,我發現是這樣的:

another_dict = {k:{'b':adict[k]['b']} for k in adict} 
+0

我猜你需要使用這個:'{k:{'transfer':adict [k] ['b']} for k in adict}' –

+0

@AshwiniChaudhary我注意到了 - 但更喜歡'.iteritems()'方法來使值查找有點更明確,但無論如何... –