2012-03-09 147 views
1

我有一個字典當類型錯誤試圖訪問字典值

d1={'a':['in-gaap','inr',0,1],'b':['in-gaap','inr',0,2],'c':['in-ca','share',0,4],'n1':['','','','aaa']} 
    d2={'d':['in-gaap','inr',0,'a+b'],'e':['in-gaap','inr',0,'y+t']} 
    for k in d2.iterkeys(): 
     a=re.findall('\w+',d2[k][3]) 
     x2=dict([(x,d1.get(x,0)[3])for x in a]) # here its showing Type:error int obj not subscriptable 
     d1[k]=[d2[k][0],d2[k][1],d2[k][2],eval(d2[k][3],x2)] 

'a' 是一個列表動態創建它分裂d [k]的[3],並將其存儲在 「一」 d [ k] [3]在第一次迭代中包含a = ['a','b']並且在第二次迭代中a = ['y','t']其實,我正在比較列表「a」鍵和字典「d1」鍵如果鍵是他們它採取該值或分配默認值,直到這工作正常。 但是,當我嘗試通過使用代碼 比較列表「a」與字典「d1」創建字典x2 = dict([(x,d1.get(x,0)[3])for a])

它顯示類型:錯誤int對象不subproptable。我dono y但d2 [k] [3]有價值,但它顯示錯誤。

+0

d1.get(X,0)[3]問題是在這裏獲得方法沒有返回列表..爲什麼你越來越[3]爲int的索引,其中,默認值是0? – 2012-03-09 07:40:34

+1

@akhter wahab如果你看到字典「d1」他們我存儲值列表d1 = {'a':['in-gaap','inr',0,1] ....}我需要得到「1 「這是在索引」3「,所以我使用d.get(x,0)[3],如果值是balnk,默認值將被分配。 – user1182090 2012-03-09 07:46:04

回答

0

d1.get(x,0)[3]。這是你的問題。如果x不在d1中,則d1.get(x,0)返回0。而0[3]是一個TypeError。

用這些線的問題行,它應該工作,假設我正確地讀出你的意圖:

values = [d1[x][3] if x in d1 else 0 for x in a] 
x2 = dict(zip(a, values)) 

這稍微更易於閱讀了。

+0

謝謝@ aquavitae,我得到了我的問題的根本原因可以說我怎麼可以修改此代碼 – user1182090 2012-03-09 07:48:32

+0

我會發布編輯 – aquavitae 2012-03-09 08:00:02

+0

感謝@ aquavitae,儘快發帖 – user1182090 2012-03-09 08:02:10

0
import re 
d1={'a':['in-gaap','inr',0,1],'b':['in-gaap','inr',0,2],'c':['in-ca','share',0,4],'n1':['','','','aaa']} 
d2={'d':['in-gaap','inr',0,'a+b'],'e':['in-gaap','inr',0,'y+t']} 
for k in d2.iterkeys(): 
    a=re.findall('\w+',d2[k][3]) 
    print a 
    for x in a: 
     print 'x is :',x # at first iteration **x=='y'** so **d1.get(x,0)** will return **0** so you can't get **d1.get(x,0)[3]** 
     print d1.get(x,0) 

輸出

['y', 't'] 
x is : y 
0 
x is : t 
0 
['a', 'b'] 
x is : a 
['in-gaap', 'inr', 0, 1] 
x is : b 
['in-gaap', 'inr', 0, 2]