如何在未知深度的字典中找到孩子?

时间:2013-12-16 17:56:06

标签: python dictionary

我希望在这个JSON字典中搜索具有值为“Controller”的键“title”的子节点。然后,当找到时,我希望从这个孩子的关键“tid”中获取值。在下面的示例字典中,值为“7”。

孩子“控制器”可能会在树中的不同深度结束。

这是JSON。我一直在寻找一种迭代未知深度儿童的方法。

  {
  "users": {
   "fredrik": {
    "J1312160092": {
     "data": {
         "somedata": 0,
         "someotherdata": [36, 1, 2, 0]
      },

     "children": [
        { "#": "T1",
           "children": [
              { "#": "T2",
                 "children": [
                    { "#": "T3",
                       "children": [
                          { "#": "T4",
                             "children": [],
                             "data": {
                                "tid": 4,
                                "title": "Pre-job: Sub-task 1",
                                "state": "+D",
                                "cids": [1]
                             }
                          },
                          { "#": "T5",
                             "children": [],
                             "data": {
                                "tid": 5,
                                "title": "Pre-job: Sub-task 2",
                                "state": "+D",
                                "cids": [2]
                             }
                          }
                       ],
                       "data": {
                          "serialsubtasks": 0,
                          "tid": 3,
                          "title": "Pre-job",
                          "state": "+A",
                          "cids": [3]
                       }
                    },
                    { "#": "T6",
                       "children": [
                          { "#": "T7",
                             "children": [
                                { "#": "T8",
                                   "children": [],
                                   "data": {
                                      "tid": 8,
                                      "title": "Master: Frame 1-1, camera(s): camera1, camera2",
                                      "state": "-B",
                                      "cids": [4]
                                   }
                                }
                             ],
                             "data": {
                                "tid": 7,
                                "title": "Controller",
                                "state": "-B",
                                "cids": [5]
                             }
                          },
                          { "#": "T9",
                             "children": [
                                { "#": "T10",
                                   "children": [],
                                   "data": {
                                      "tid": 10,
                                      "title": "Frame 1",
                                      "state": "-B",
                                      "cids": [6]
                                   }
                                },
                                { "#": "T11",
                                   "children": [],
                                   "data": {
                                      "tid": 11,
                                      "title": "Frame 2",
                                      "state": "-B",
                                      "cids": [7]
                                   }
                                },
                                { "#": "T12",
                                   "children": [],
                                   "data": {
                                      "tid": 12,
                                      "title": "Frame 3",
                                      "state": "-B",
                                      "cids": [8]
                                   }
                                }
                             ],
                             "data": {
                                "tid": 9,
                                "title": "Frame holder",
                                "state": "-B"
                             }
                          }
                       ],
                       "data": {
                          "serialsubtasks": 0,
                          "tid": 6,
                          "title": "Frame job",
                          "state": "-B"
                       }
                    }
                 ],
                 "data": {
                    "serialsubtasks": 1,
                    "tid": 2,
                    "title": "Blocker",
                    "state": "-B"
                 }
              }
           ],
           "data": {
              "tid": 1,
              "title": "Main job",
              "state": "-B"
           }
        }
     ]
  }

   }
  },
  "recordlimit": {"limit": 1, "truncated": 0}
  }

3 个答案:

答案 0 :(得分:2)

递归你的json并寻找控制器。这段代码应该与json的结构无关,横跨子列表和字典,并产生第一个字典的tid,其中包含一个值为“Controller”的键“title”。

def findTid (j):
    if isinstance (j, dict):
        if 'title' in j and j ['title'] == 'Controller':
            return j ['tid']
        for v in j.values ():
            r = findTid (v)
            if r: return r
    if isinstance (j, list):
        for e in j:
            r = findTid (e)
            if r: return r

使用您的数据调用它返回'7'。

答案 1 :(得分:0)

我认为你想要一个递归函数:

def find(tree):
    if tree["data"]["title"] == "Controller":
         return tree["data"]["tid"]
    if "children" in tree:
        return 
    for child in tree["children"]:
        f = find(child)
        if f:
             return f

答案 2 :(得分:0)

尝试使用正则表达式和 re.findall 与您在树中寻找的模式。