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.