How to merge a nested list of dictionaries with other list of dictionaries?

Tags: , , , ,



I have a list of dictionaries containing lists of dictionaries containing a dictionary:

super_data: [{'data': [{'attributes': {'stuff': 'test'
                                       'stuff2': 'tester'}
                       }]}
             {'data': [{'attributes': {'stuff': 'test2'
                                       'stuff2': 'tester2'}
                       }]}

I have other lists of dictionaries which might look like:

super_meta_data: [{'meta_data': [{'attributes': {'thing': 'testy'
                                                 'thing2': 'testy2'}
                                }]}
                  {'meta_data': [{'attributes': {'thing': 'testy3'
                                                 'thing': 'testy4'}
                                }]}

I want to merge the nested list of dicts like so:

super_data: [{'data': [{'attributes': {'stuff': 'test'
                                       'stuff2': 'tester'}
                      }]
              'meta_data': [{'attributes': {'thing': 'testy'
                                            'thing2': 'testy2'}
                            }]
             }
             {'data': [{'attributes': {'stuff': 'test'
                                       'stuff2': 'tester'}
                      }]
              'meta_data': [{'attributes': {'thing': 'testy3'
                                            'thing2': 'testy4'}
                      }]
             }

How would I go about doing that? I’m trying:

for i in super_data:
     super_data.append([i][super_meta_data]

But it’s throwing:

TypeError: list indices must be integers or slices, not dict

Appreciate any insight!

Answer

You might try the following, using zip:

for data, meta_data in zip(super_data, super_meta_data):
     data.update(meta_data)

Or, with the same result, using a list comprehension:

super_data = [{**d, **md} for d, md in zip(super_data, super_meta_data)]

>>> super_data
[{'data': [{'attributes': {'stuff': 'test', 'stuff2': 'tester'}}],
  'meta_data': [{'attributes': {'thing': 'testy', 'thing2': 'testy2'}}]},
 {'data': [{'attributes': {'stuff': 'test2', 'stuff2': 'tester2'}}],
  'meta_data': [{'attributes': {'thing': 'testy3', 'thing2': 'testy4'}}]}]

If you want to make your index-based approach work:

for i in range(len(super_data)):
    super_data[i].update(super_meta_data[i])


Source: stackoverflow