Consolidate array of dicts by key

Viewed 32

I have an array of dicts, with employees listed for each boss:

comp = [
    {'employees': ['chris', 'samantha', 'peter'], 'boss': 'Joe'}
    {'employees': ['cristy', 'jebadiah', 'coco'], 'boss': 'Susan'}
    {'employees': ['misty', 'jemima', 'douglas'], 'boss': 'Susan'}
    {'employees': ['arther', 'bily', 'jenkens'], 'boss': 'Susan'}
    {'employees': ['cari', 'sephora', 'betrice'], 'boss': 'Billy'}
]

I need to consolidate the employees per boss in a new dict like this:

comp = [
    {'employees': ['chris', 'samantha', 'peter'], 'boss': 'Joe'}
    {'employees': ['cristy', 'jebadiah', 'coco', 'misty', 'jemima', 'douglas', 'arther', 'bily', 'jenkens'], 'boss': 'Susan'}
    {'employees': ['cari', 'sephora', 'betrice'], 'boss': 'Billy'}
]
2 Answers

You can use the following:

>>> index = {}
>>> for i, elem in enumerate(comp[:]):
        current_boss = elem['boss']
        if current_boss in index:
            comp[index[current_boss]]['employees'].extend(elem['employees'])
            del comp[i]
        else:
            index[current_boss] = i
>>> comp
[{'employees': ['chris', 'samantha', 'peter'], 'boss': 'Joe'},
 {'employees': ['cristy',
   'jebadiah',
   'coco',
   'misty',
   'jemima',
   'douglas',
   'arther',
   'bily',
   'jenkens'],
  'boss': 'Susan'},
 {'employees': ['arther', 'bily', 'jenkens'], 'boss': 'Susan'}]

Not the most elegant solution, but you can use this code:

comp = [
    {'employees': ['chris', 'samantha', 'peter'], 'boss': 'Joe'},
    {'employees': ['cristy', 'jebadiah', 'coco'], 'boss': 'Susan'},
    {'employees': ['misty', 'jemima', 'douglas'], 'boss': 'Susan'},
    {'employees': ['arther', 'bily', 'jenkens'], 'boss': 'Susan'},
    {'employees': ['cari', 'sephora', 'betrice'], 'boss': 'Billy'}
]
comp_modified = []

for dct in comp:
    boss_exists = False # Determine if boss was previously added to comp_modified
    for dct2 in comp_modified:
        if dct['boss'] == dct2['boss']:
            boss_exists = True
            for emp in dct['employees']:
                dct2['employees'].append(emp)
    if not boss_exists:
        comp_modified.append({'employees': dct['employees'], 'boss': dct['boss']})

This will iterate through comp in the outer-most loop using dct, then iterate through comp_modified in the next loop using dct2. In each iteration, if the value of dct['boss'] has already been added to comp_modified, it will append dct's employees to dct2['employees']. Otherwise, it will add dct's employees to a new dictionary and add that to comp_modified.

Related