将值添加到python中的嵌套字典

时间:2019-03-15 05:04:20

标签: python dictionary recursion

我有以下字典

d1 = {
  "Completely Agree": {
    "child": {
      "Male": {
        "child": {
          "Greater than 54": {
            "child": {},
            "value": 4,
            "label": "Greater than 54"
          },
          "Between 35 to 39": {
            "child": {},
            "value": 1,
            "label": "Between 35 to 39"
          }
        },
        "value": 5,
        "label": "Male"
      }
    },
    "value": 5,
    "label": "Completely Agree"
  },
  "Somewhat Agree": {
    "child": {
      "Male": {
        "child": {
          "Greater than 54": {
            "child": {},
            "value": 1,
            "label": "Greater than 54"
          },
          "Between 45 to 49": {
            "child": {},
            "value": 2,
            "label": "Between 45 to 49"
          },
          "Between 25 to 29": {
            "child": {},
            "value": 1,
            "label": "Between 25 to 29"
          },
          "Between 35 to 39": {
            "child": {},
            "value": 1,
            "label": "Between 35 to 39"
          },
          "Between 50 to 54": {
            "child": {},
            "value": 3,
            "label": "Between 50 to 54"
          },
          "Between 40 to 44": {
            "child": {},
            "value": 1,
            "label": "Between 40 to 44"
          }
        },
        "value": 9,
        "label": "Male"
      },
      "Female": {
        "child": {
          "Between 25 to 29": {
            "child": {},
            "value": 2,
            "label": "Between 25 to 29"
          },
          "Between 30 to 34": {
            "child": {},
            "value": 1,
            "label": "Between 30 to 34"
          },
          "Greater than 54": {
            "child": {},
            "value": 1,
            "label": "Greater than 54"
          }
        },
        "value": 4,
        "label": "Female"
      }
    },
    "value": 13,
    "label": "Somewhat Agree"
  },
  "Neither Agree nor Disagree": {
    "child": {
      "Male": {
        "child": {
          "Between 25 to 29": {
            "child": {},
            "value": 1,
            "label": "Between 25 to 29"
          },
          "Between 35 to 39": {
            "child": {},
            "value": 1,
            "label": "Between 35 to 39"
          },
          "Between 30 to 34": {
            "child": {},
            "value": 1,
            "label": "Between 30 to 34"
          },
          "Between 45 to 49": {
            "child": {},
            "value": 1,
            "label": "Between 45 to 49"
          },
          "Between 50 to 54": {
            "child": {},
            "value": 1,
            "label": "Between 50 to 54"
          }
        },
        "value": 5,
        "label": "Male"
      },
      "Female": {
        "child": {
          "Less than 25": {
            "child": {},
            "value": 1,
            "label": "Less than 25"
          }
        },
        "value": 1,
        "label": "Female"
      }
    },
    "value": 6,
    "label": "Neither Agree nor Disagree"
  }

我想插入另一个键,让它在子级为空字典{}的同一级别说'data_recs'。所以结果应该是

d1 =  {
  "Completely Agree": {
    "child": {
      "Male": {
        "child": {
          "Greater than 54": {
            "child": {},
            "value": 4,
            "label": "Greater than 54",
            "data_recs": [1,2,3,4]
          },
          "Between 35 to 39": {
            "child": {},
            "value": 1,
            "label": "Between 35 to 39",
            "data_recs": [1,2,3,4]
          }
        },
        "value": 5,
        "label": "Male"
      }
    },
    "value": 5,
    "label": "Completely Agree"
  },
  "Somewhat Agree": {
    "child": {
      "Male": {
        "child": {
          "Greater than 54": {
            "child": {},
            "value": 1,
            "label": "Greater than 54",
            "data_recs": [1,2,3,4]
          },
          "Between 45 to 49": {
            "child": {},
            "value": 2,
            "label": "Between 45 to 49"
          },
          "Between 25 to 29": {
            "child": {},
            "value": 1,
            "label": "Between 25 to 29",
            "data_recs": [1,2,3,4]
          },
          "Between 35 to 39": {
            "child": {},
            "value": 1,
            "label": "Between 35 to 39",
            "data_recs": [1,2,3,4]
          },
          "Between 50 to 54": {
            "child": {},
            "value": 3,
            "label": "Between 50 to 54",
            "data_recs": [1,2,3,4]
          },
          "Between 40 to 44": {
            "child": {},
            "value": 1,
            "label": "Between 40 to 44",
            "data_recs": [1,2,3,4]
          }
        },
        "value": 9,
        "label": "Male"
      },
      "Female": {
        "child": {
          "Between 25 to 29": {
            "child": {},
            "value": 2,
            "label": "Between 25 to 29",
            "data_recs": [1,2,3,4]
          },
          "Between 30 to 34": {
            "child": {},
            "value": 1,
            "label": "Between 30 to 34",
            "data_recs": [1,2,3,4]
          },
          "Greater than 54": {
            "child": {},
            "value": 1,
            "label": "Greater than 54",
            "data_recs": [1,2,3,4]
          }
        },
        "value": 4,
        "label": "Female"
      }
    },
    "value": 13,
    "label": "Somewhat Agree"
  }

字典可以具有n个层次。我已经编写了以下代码来实现此目的,但是我想这里缺少一些东西。

def parse_master_dict(data, recs_map):
    for k,v in data.items():
        print k, v
        if v.get('child', None):
            child = v['child']
            if not child:
                print "here", k
                v['data_recs'] = recs_map.get(k, [])
            else:
                #if child can have further children
                parse_master_dict(child, recs_map)

请告知。

1 个答案:

答案 0 :(得分:2)

您的if v.get('child', None):语句阻止您在子字典为空时继续更新字典,因为条件将被评估为False。删除if语句,您的代码应该可以运行:

def parse_master_dict(data, recs_map):
    for k,v in data.items():
        child = v['child']
        if not child:
            v['data_recs'] = recs_map.get(k, [])
        else:
            parse_master_dict(child, recs_map)