【问题标题】:List of dictionaries, in a dictionary - in Python字典列表,在字典中 - 在 Python 中
【发布时间】:2010-12-25 18:04:31
【问题描述】:

我有一种情况,我需要以编程方式构造以下结构(是的,我知道 .setdefault 和 defaultdict,但我无法得到我想要的)

我基本上需要一本字典,其中包含在循环中创建的字典字典。 一开始结构是完全空白的。

结构示例(请注意,我想在代码中创建一个具有此结构的数组!)

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 = ????
...   

上面的代码显然不工作,因为我不知道该怎么做!

【问题讨论】:

  • 您的样本不是有效的python
  • 尽量清楚一点,你的结构样本没有意义。您不能在方括号内使用 4514 : {} 语法。

标签: python list dictionary nested


【解决方案1】:

例如,您发布的不是有效的 python 代码,我只能想象您正在尝试做这样的事情:

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

这样self.rules是字典的字典列表的字典。我敢打赌有更理智的方法可以做到这一点。

【讨论】:

    【解决方案2】:
    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',因为您从未提及从何处获得它们,但我认为它们已经知道结果集中或某种结构中的列名。

    只要继续添加到结构中即可。

    【讨论】:

      【解决方案3】:

      您的示例代码似乎不是有效的 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'}}
      

      【讨论】:

        【解决方案4】:

        我最喜欢处理嵌套字典和字典列表的方法是使用PyYAMLSee this response for details.

        【讨论】:

          【解决方案5】:

          好吧,我为造成的混乱道歉,我从未声称代码实际编译过,因此(伪)。亚瑟托马斯让我走上了正轨,这里是稍微修改过的版本。 (是的,现在它是一个简单嵌套的字典,向下 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]
          

          【讨论】:

          • 在 Stack Overflow 上处理此问题的正确方法是编辑您的问题以澄清整个问题,而不是输入可能不是答案的“答案”。如果这确实是一个答案,请单击左侧的复选标记图标接受它。否则以后来这里的人根本不知道你在做什么。
          猜你喜欢
          • 1970-01-01
          • 2014-10-15
          • 2018-02-06
          • 1970-01-01
          • 2017-05-05
          • 2014-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多