2009-12-11 22 views
2

我有我需要構建以下結構編程(是的,我知道.setdefault和defaultdict的,但我不能得到我想要的)名單,在一本字典 - 在Python

的情況下,我基本上需要一本字典,並在循環中創建一個字典詞典。 開始的時候結構是完全空白的。

結構樣品(請注意,我希望創建一個代碼具有這種結構的陣列!)

RULE = { 
    'hard_failure': { 
     4514 : { 
      'f_expr' = 'ABC', 
      'c_expr' = 'XF0', 
    } 
    } 
    } 
需要創建此

僞代碼:以上

... 
self.rules = {} 
for row in rows: 
    a = 'hard_failure' 
    b = row[0] # 4514 
    c = row[1] # ABC 
    d = row[2] # XF0 
    # Universe collapse right after 
    self.rules = ???? 
... 

代碼顯然不工作,因爲我不知道該怎麼做!

+0

你的樣品是不是一個有效的Python – SilentGhost 2009-12-11 17:04:58

+1

嘗試更加清晰,你的結構樣品是沒有意義的。您不能在方括號內使用4514:{}語法。 – 2009-12-11 17:07:26

回答

5

例如,您已經張貼是不是一個有效的Python代碼,我只能想象,你試圖做這樣的事情:

self.rules[a] = [{b:{'f_expr': c, 'c_expr': d}}] 

這樣self.rules是列表的字典字典的字典。我敢打賭有更理智的方式來做到這一點。

+0

+1「我打賭有更多理智的方法」 – chucksmash 2012-02-13 17:26:12

0

您的示例代碼似乎不是有效的Python。目前還不清楚第二級元素應該是列表還是字典。

但是,如果你在做什麼,我認爲你這樣做,這是一本字典,你可以使用一個元組作爲頂級的字典,而不是嵌套字典的關鍵:

>>> a = 'hard_failure' 
>>> b = 4514 
>>> c = "ABC" 
>>> d = "XF0" 
>>> rules = {} 
>>> rules[(a,b)] = {'f_expr' : a,'c_expr' : d} 
>>> rules 
{('hard_failure', 4514): {'c_expr': 'XF0', 'f_expr': 'hard_failure'}} 
1
rules = {} 
failure = 'hard_failure' 
rules[failure] = [] 
for row in rows: 
    #this is what people are referring to below. You left out the addition of the dictionary structure to the list. 
    rules[failure][row[0]] = {} 
    rules[failure][row[0]]['type 1'] = row[1] 
    rules[failure][row[0]]['type 2'] = row[2] 

這是我根據我如何理解問題創建的。我不知道該怎麼稱呼'f_expr'和'c_expr',因爲你從來沒有提到你在哪裏得到這些信息,但我認爲他們已經知道某種結果集或結構中的列名。

只要繼續添加到結構,你去。

0

好吧,我很抱歉造成混亂,我從來沒有聲稱實際編譯的代碼,因此(僞)。亞瑟托馬斯把我放在正確的軌道上,這裏是略有修改的版本。 (是的,現在它是一個簡單的嵌套字典,3級向下)

RULE_k = 'hard_failure' 
    self.rules = {} 
    for row in rows: 
      self.rules_compiled.setdefault(RULE_k, {}) 
      self.rules_compiled[RULE_k][row[1]] = {} 
      self.rules_compiled[RULE_k][row[1]]['f_expr'] = row[0] 
      self.rules_compiled[RULE_k][row[1]]['c_expr'] = row[1] 
+1

在Stack Overflow上處理這個問題的正確方法是編輯你的問題來澄清整個事情,而不是放入一個可能不是答案的「答案」。如果這真的是一個答案,那麼點擊左側的複選標記圖標接受它。否則,後來到這裏的人不知道你要做什麼。 – 2009-12-13 03:27:33