Форум сайта python.su
0
Буду очень благодарен за совет, как решить такое:
Есть 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": "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)
Отредактировано Vort (Сен. 29, 2018 12:41:46)
Офлайн
253
А что мешает вам делать так как вы написали?
for d in entities_list: if d["entity_name"]== d["operation"]: d["fields"] = {d["firstname"]:d["period"]}
Vortнепонятно к чему относится.
сгруппированные таким образом
from collections import dafaultdict merged = defaultdict(list) for d in entities_list: merged[(d["entity_name"],d["operation"])].append(d) ....
Офлайн
0
doza_andЯ может неточно выразился, дело в том, что записи могут повторяться и имена вложенного fields заранее неизвестны. И словари типа
непонятно к чему относится.
{ "period": 120, "entity_name": "metadata", "operation": "hash", "fields": "customer_id" }, { "period": 120, "entity_name": "metadata", "operation": "hash", "fields": "first_name" }
{ "period": 120, "entity_name": "metadata", "operation": "hash", "fields": { "first_name": 120, "customer_id": 120 } }
Отредактировано Vort (Сен. 29, 2018 19:29:28)
Офлайн
857
Надо сначала выбрать словари для слияния, а уже потом выбранные словари сливать. Не надо всё делать одновременно.
Офлайн