Python append inner dictionary into outer dictionary into list

Viewed 75

I'm trying to get the multiple inner dictionary object into one outer dictionary as they are related. Which eventually append in a final list.

My code:

from collections import defaultdict

data = {"events":[{"inner_1":"11111","inner_2":"10.90.1.14","inner_3":"Active","outer_1":"45038","outer_2":"No","outer_3":"No Time"},{"inner_1":"33333","inner_2":"10.22.1.35","inner_3":"No","outer_1":"38610","outer_2":"No","outer_3":"Some Time"},{"inner_1":"4444","inner_2":"10.22.1.11","inner_3":"Active","outer_1":"38610","outer_2":"No","outer_3":"Some Time"},{"inner_1":"22222","inner_2":"10.90.1.33","inner_3":"No","outer_1":"45038","outer_2":"No","outer_3":"Some Time"},{"inner_1":"55555","inner_2":"10.90.1.33","inner_3":"Active","outer_1":"45038","outer_2":"Active","outer_3":"Some Time"}]}

final_list = []
outer_dict = defaultdict(list)
inner_dict = defaultdict(list)
rows = data.get('events')
counter = 0
for row in rows:
    table_list = []
    o1 = str(row.get('outer_1'))
    o2 = str(row.get('outer_2'))
    o3 = str(row.get('outer_3'))
    i1 = str(row.get('inner_1'))
    i2 = str(row.get('inner_2'))
    i3 = str(row.get('inner_3'))

    inner_dict = {"inner_1":i1,"inner_2":i2,"inner_3":i3}

    if outer_dict.get("outer_1") != o1:
        outer_dict = {"outer_1":o1,"outer_2":o2,"outer_3":o3}
        outer_dict.setdefault("details", []).append(inner_dict)
        final_list.append(outer_dict)
    else:
        for i in final_list:
            if i.get("outer_1") == o1:
                i.setdefault("details", []).append(inner_dict)
print(final_list)

Expected data:

[
 {"outer_1":"45038",
  "outer_2":"No",
  "outer_3":"No Time",
  "details":[
             {"inner_3":"Active","inner_1":"11111","inner_2":"10.90.1.14"}, 
             {"inner_3":"Active","inner_1":"55555","inner_2":"10.90.1.33"}, 
             {"inner_3":"No","inner_1":"22222","inner_2":"10.90.1.33"}
  ]},
  {"outer_1":"38610",
   "outer_2":"No",
   "outer_3":"Some Time",
   "details":[{"inner_3":"No","inner_1":"33333","inner_2":"10.22.1.35"},
             {"inner_3":"Active","inner_1":"4444","inner_2":"10.22.1.11"}
  ]}
]

Wrong output Getting:

[
 {"outer_1":"45038",
  "outer_2":"No",
  "outer_3":"No Time",
  "details":[{"inner_3":"Active","inner_1":"11111","inner_2":"10.90.1.14"},
             {"inner_3":"Active","inner_1":"55555","inner_2":"10.90.1.33"}
   ]},
  {"outer_1":"38610",
   "outer_2":"No",
   "outer_3":"Some Time",
   "details":[{"inner_3":"No","inner_1":"33333","inner_2":"10.22.1.35"},
              {"inner_3":"Active","inner_1":"4444","inner_2":"10.22.1.11"}
   ]},
  {"outer_1":"45038",
   "outer_2":"No",
   "outer_3":"Some Time",
   "details":[{"inner_3":"No","inner_1":"22222","inner_2":"10.90.1.33"},
              {"inner_3":"Active","inner_1":"55555","inner_2":"10.90.1.33"}
   ]}
]

Please help!!!

2 Answers

Try this:

from collections import defaultdict
data = {"events":[{"inner_1":"11111","inner_2":"10.90.1.14","inner_3":"Active","outer_1":"45038","outer_2":"No","outer_3":"No Time"},{"inner_1":"33333","inner_2":"10.22.1.35","inner_3":"No","outer_1":"38610","outer_2":"No","outer_3":"Some Time"},{"inner_1":"4444","inner_2":"10.22.1.11","inner_3":"Active","outer_1":"38610","outer_2":"No","outer_3":"Some Time"},{"inner_1":"22222","inner_2":"10.90.1.33","inner_3":"No","outer_1":"45038","outer_2":"No","outer_3":"Some Time"},{"inner_1":"55555","inner_2":"10.90.1.33","inner_3":"Active","outer_1":"45038","outer_2":"Active","outer_3":"Some Time"}]}

inner, outer = defaultdict(list), {}
for x in data['events']:
    inner[x['outer_1']].append({k: v for k, v in x.items() if 'inner_' in k}) 
    if x['outer_1'] not in outer:
        outer[x['outer_1']] = {k: v for k, v in x.items() if 'outer_' in k}

for k, v in outer.items():
    v['details'] = inner[k]

ans = list(outer.values())
print(ans)

Output

[
  {
    "outer_1": "45038",
    "outer_2": "No",
    "outer_3": "No Time",
    "details": [
      {
        "inner_1": "11111",
        "inner_2": "10.90.1.14",
        "inner_3": "Active"
      },
      {
        "inner_1": "22222",
        "inner_2": "10.90.1.33",
        "inner_3": "No"
      },
      {
        "inner_1": "55555",
        "inner_2": "10.90.1.33",
        "inner_3": "Active"
      }
    ]
  },
  {
    "outer_1": "38610",
    "outer_2": "No",
    "outer_3": "Some Time",
    "details": [
      {
        "inner_1": "33333",
        "inner_2": "10.22.1.35",
        "inner_3": "No"
      },
      {
        "inner_1": "4444",
        "inner_2": "10.22.1.11",
        "inner_3": "Active"
      }
    ]
  }
]

I also tried one thing. I used the if condition to reduce the for loop.

data = {"events":[{"inner_1":"11111","inner_2":"10.90.1.14","inner_3":"Active","outer_1":"45038","outer_2":"No","outer_3":"No Time"},{"inner_1":"33333","inner_2":"10.22.1.35","inner_3":"No","outer_1":"38610","outer_2":"No","outer_3":"Some Time"},{"inner_1":"4444","inner_2":"10.22.1.11","inner_3":"Active","outer_1":"38610","outer_2":"No","outer_3":"Some Time"},{"inner_1":"22222","inner_2":"10.90.1.33","inner_3":"No","outer_1":"45038","outer_2":"No","outer_3":"Some Time"},{"inner_1":"55555","inner_2":"10.90.1.33","inner_3":"Active","outer_1":"45038","outer_2":"Active","outer_3":"Some Time"}]}

final_list = []
rows = data.get('events')
counter = 0
insert = {}
for row in rows:
    table_list = []
    o1 = str(row.get('outer_1'))
    o2 = str(row.get('outer_2'))
    o3 = str(row.get('outer_3'))
    i1 = str(row.get('inner_1'))
    i2 = str(row.get('inner_2'))
    i3 = str(row.get('inner_3'))


    inner_dict = {"inner_1":i1,"inner_2":i2,"inner_3":i3}

    for item in final_list:
        if item.get("outer_1") == o1:
            item["details"].append(inner_dict)
            insert[o1] = True
    if not insert.get(o1):
        outer_dict = {"outer_1":o1,"outer_2":o2,"outer_3":o3}
        outer_dict["details"] = [inner_dict]
        final_list.append(outer_dict)
print(final_list)
Related