2010-10-12 69 views
3

我想要做這樣的事情:Python化的方式來寫創建字典詞典的理解,+別的

parsetable = { 
       # ... 

       declarations: { 
          token: 3 for token in [_id, _if, _while, _lbrace, _println] 
          }.update({_variable: 2}), 

       #... 
      } 

然而,這並不工作,因爲更新不返回任何東西。除了明確地寫完整個詞典之外,有沒有簡單的方法可以做到這一點?

應該可以使用dict()和元組的列表理解+額外的部分,但這很尷尬。

+0

爲什麼不是這兩個陳述?你爲什麼打代碼高爾夫球? 'parsetable ='和'parsetable [declarations] .update()'有什麼問題? – 2010-10-12 19:39:48

+1

完整的可解析字典已經有70行,我想將所有相關數據保存在一個地方,以便查找或更改。 – 2010-10-12 19:49:41

+0

「更容易查找或更改」?複雜的陳述如何「更容易查找或更改」?如果你的維護程序員是天才,我想代碼高爾夫可能是好的。但對於那些追隨你的人來說,簡單看起來更有價值。 – 2010-10-12 20:01:55

回答

4

我想你提到使用字典()和元組列表的方法是我會做的方式:

dict([(x, 3) for x in [_id, _if, _while, _lbrace, _println]] + [(_variable, 2)]) 

如果你真的想使用字典理解,你可以這樣做:

{ x : 2 if x == _variable else 3 
    for x in [_id, _if, _while, _lbrace, _println, _variable] } 
+0

感謝您的回覆。我認爲dict()/元組列表實際上是我想要去的方式。 – 2010-10-13 14:07:28

1

然而,只是爲了讓你知道,如果你想更新返回somethign,你可以寫像FUNC:

import copy 
def updated_dict(first_dict, second_dict): 
    f = copy.deepcopy(first_dict) 
    f.update(second_dict) 
    return f 
+0

感謝您的迴應,我現在使用dict()/ tuple列表,但我非常想/你的/ martineau的回覆,所以我必須繼續考慮它。 – 2010-10-13 14:08:40

1

我會分裂它爲清楚再申請@馬克拜爾斯的第二個建議的字典理解:

type2 = [_variable] 
type3 = [_id, _if, _while, _lbrace, _println] 

parsetable = { 
    declarations: { token : 2 if token in type2 else 3 for token in type2+type3 } 
} 

這使事情變得非常清晰,具有可擴展性,同時保持相關項目放在一起進行查找的方便和/或修改。

+1

我也擺脫了編碼的幻數... – martineau 2010-10-12 21:47:06

1

這裏是類似於@Ant提到顯示應用到您的樣本數據的東西:

def merged_dicts(dict1, *dicts): 
    for dict_ in dicts: 
     dict1.update(dict_) 
    return dict1 

parsetable = { 
    declarations: 
     merged_dicts(
      { token: 3 for token in [_id, _if, _while, _lbrace, _println] }, 
      { _variable: 2 } 
     ), 
} 

我離開了初步copy.deepcopy()出來,因爲這是不必要的這種用法。