Есть list из dict-ов, типа:
entities_list = [ { "period": 190, "entity_name": "metadata", "operation": "delete", "fields": "age" }, { "period": 120, "entity_name": "metadata", "operation": "hash", "fields": "customer_id" }, { "period": 30, "entity_name": "qtnn-details", "operation": "hash", "fields": "*" }, { "period": 90, "entity_name": "address", "operation": "hash", "fields": "*" }, { "period": 120, "entity_name": "metadata", "operation": "hash", "fields": "first_name" }, { "period": 30, "entity_name": "qtnn-details", "operation": "delete", "fields": "invite_survey" }, { "period": 30, "entity_name": "qtnn-details", "operation": "delete", "fields": "msisdn" } ]
Его надо перебрать и при совпадении “entity_name” и “operation”, строкове значение поля “fields”, превратить в {'first_name': 120} (если fields был first_name, а period 120).
Чтобы получились dict-ы, сгруппированные таким образом
{ "entity_name": "metadata", "period": 120, "operation": "hash", "fields": { "first_name": 120, "customer_id": 120 } }
Пытаюсь делать так:
merged = [] for entity in entities_list: if merged: for item in merged: if ( item['entity_name'] == entity['entity_name'] and item['operation'] == entity['operation'] ): if isinstance(item['fields'], str) and item['fields'] != '*': item['fields'] = { item['fields']: item['period'], entity['fields']: entity['period'] } elif isinstance(item['fields'], dict): item['fields'].update({ entity['fields']: entity['period'] }) continue else: if entity not in merged: merged.append(entity) continue else: merged.append(entity)
Но в итоге цикл, начинаает ходить повторно, по второму листу. Посоветуйте пожалуйста, как такое лучше решить?