obter um subdic específico em um dic aninhado com base na chave

Dec 19 2020

Eu tenho um dicionário aninhado. E eu gostaria de extrair um subdicionário com base em um determinado atributo: Aqui está uma versão mais simples do meu dicionário:

subdata = {
     "id": 997,
     "acronym": "root",
     "color_hex_triplet": "FFFFFF",
     "children": [
      {
       "id": 8,
       "acronym": "grey",
       "color_hex_triplet": "BFDAE3",
       "children": [
        {
         "id": 567,
         "acronym": "CH",
         "color_hex_triplet": "B0F0FF",
         "children": [
          {
           "id": 688,
           "acronym": "CTX",
           "color_hex_triplet": "B0FFB8",
           "children": [
            {
             "id": 695,
             "acronym": "CTXpl",
             "color_hex_triplet": "70FF70",
             "children": [
              {
               "id": 315,
               "acronym": "Isocortex",
               "color_hex_triplet": "70FF71",
               "children": [
                {
                 "id": 184,
                 "acronym": "FRP",
                 "color_hex_triplet": "268F45",
                 "children": [
                  {
                   "id": 68,
                   "acronym": "FRP1",
                   "color_hex_triplet": "268F45",
                   "children": []
                  },
                                    {
                   "id": 69,
                   "acronym": "FRP2",
                   "color_hex_triplet": "268F45",
                   "children": []
                  }]}]}]}]}]]}]}]}

E com base, por exemplo, em "acrônimo": "FRP" Eu quero obter aquele determinado dicionário e todos os seus filhos assim:

region_dict = {
"id": 184,
"acronym": "FRP",
"color_hex_triplet": "268F45",
"children": [
{
"id": 68,
"acronym": "FRP1",
"color_hex_triplet": "268F45",
"children": []},
{"id": 69,
"acronym": "FRP2",
"color_hex_triplet": "268F45",
"children": []
}]}

Tentei o seguinte código (da sugestão do Aplet123), mas não parece retornar o dicionário. Ele apenas retorna True. Estou fazendo algo errado?

def get_parent_dict(dic, reg):
    if dic['acronym'] == reg:
        return dic
    for child in dic["children"]:
        result = get_parent_dict(child, reg) is not None
        if result is not None:
            return result
    return None # not technically needed

f = open(json_path) 
data = json.load(f) 

subdata = data['msg'][0] #this is a nested dictionary

region_dict = get_parent_dict(subdata, "FRP")

Respostas

1 Aplet123 Dec 19 2020 at 05:24

Você pode usar uma primeira pesquisa em profundidade:

def dfs_for_id(dic, id):
    if dic["id"] == id:
        return dic
    for child in dic["children"]:
        result = dfs_for_id(child, id)
        if result is not None:
            return result
    return None # not technically needed