Group a List of Python Dictionaries -


i have json data coming api list of dictionaries, such as:

entities = [     {'name': 'mcdonalds', 'city': 'new york', 'gross': 250000000, 'id': '000001'},     {'name': 'mcdonalds', 'city': 'philadelphia', 'gross': 190000000, 'id': '000002'},     {'name': 'shake shack', 'city': 'los angeles', 'gross': 17000000, 'id': '000003'},     {'name': 'in-n-out burger', 'city': 'houston', 'gross': 23000000, 'id': '000004'},     {'name': 'in-n-out burger', 'city': 'atlanta', 'gross': 12000000, 'id': '000005'},     {'name': 'in-n-out burger', 'city': 'dallas', 'gross': 950000, 'id': '000006'}, ] 

i'm trying group entries same name list of dictionaries named whatever business is.

def group_entities(entities):      entity_groups = []      # establish blank list each unique name     entity in entities:         entity['name'] = []         entity_groups.append(entity['name'])      # within each business's list, add separate dictionaries details     entity in entities:         entity['name'].append({             'name':entity['name'],             'city':entity['city'],             'gross':entity['gross'],             'id':entity['id']             })      entity_groups.extend(entity['name'])      return entity_groups 

i can't use entity['name'] variable name because changes original value nor can use string version of name. want end data can iterate , display like:

business   • city 1 dictionary values    • city 2 dictionary values, etc business   • city 1 dictionary values    • city 2 dictionary values, etc 

i'm @ loss how further research on because don't know proper 'googleable' terms describe trying do.

if data ordered name:

from itertools import groupby operator import itemgetter  entities = [     {'name': 'mcdonalds', 'city': 'new york', 'gross': 250000000, 'id': '000001'},     {'name': 'mcdonalds', 'city': 'philadelphia', 'gross': 190000000, 'id': '000002'},     {'name': 'shake shack', 'city': 'los angeles', 'gross': 17000000, 'id': '000003'},     {'name': 'in-n-out burger', 'city': 'houston', 'gross': 23000000, 'id': '000004'},     {'name': 'in-n-out burger', 'city': 'atlanta', 'gross': 12000000, 'id': '000005'},     {'name': 'in-n-out burger', 'city': 'dallas', 'gross': 950000, 'id': '000006'}, ] data =  [{k: list(v)}  k, v in groupby(entities, itemgetter("name"))] 

which give you:

[{'mcdonalds': [{'id': '000001', 'city': 'new york', 'name': 'mcdonalds', 'gross': 250000000}, {'id': '000002', 'city': 'philadelphia', 'name': 'mcdonalds', 'gross': 190000000}]}, {'shake shack': [{'id': '000003', 'city': 'los angeles', 'name': 'shake shack', 'gross': 17000000}]}, {'in-n-out burger': [{'id': '000004', 'city': 'houston', 'name': 'in-n-out burger', 'gross': 23000000}, {'id': '000005', 'city': 'atlanta', 'name': 'in-n-out burger', 'gross': 12000000}, {'id': '000006', 'city': 'dallas', 'name': 'in-n-out burger', 'gross': 950000}]}] 

or if don't want name:

 keys = ("id","gross", "city")   data = [{k: [dict(zip(keys, itemgetter(*keys)(dct))) dct in v]}  k, v in groupby(entities, itemgetter("name"))] 

if data not ordered can use defaultdict:

from collections import defaultdict  d = defaultdict(list)  entity in entities:     d[entity["name"]].append(dict(entity)) print([{k: v} k,v in d.items()]) 

again cab remove name or maybe wan use original dicts , don't mind mutating them :

from collections import defaultdict  d = defaultdict(list)  entity in entities:     d[entity.pop("name")].append(entity) print([{k: v} k,v in d.items()]) 

that give you:

[{'shake shack': [{'id': '000003', 'city': 'los angeles', 'gross': 17000000}]}, {'mcdonalds': [{'id': '000001', 'city': 'new york', 'gross': 250000000}, {'id': '000002', 'city': 'philadelphia', 'gross': 190000000}]}, {'in-n-out burger': [{'id': '000004', 'city': 'houston', 'gross': 23000000}, {'id': '000005', 'city': 'atlanta', 'gross': 12000000}, {'id': '000006', 'city': 'dallas', 'gross': 950000}]}] 

it depends on whether want use original dicts again and/or if want names kept in dicts. can combine parts of logic whatever format like.