2009-12-11 24 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