Вчера у меня возникла проблема с реструктуризацией списка диктовок здесь (я упоминаю, если это помогает кому-то еще, имеющему подобную проблему):
Перестройка списка Python Dicts с использованием setdefault
Однако я опустил одну (теперь, казалось бы, ключевую) часть данных. Первоначально я думал, что будет легче добавить дополнительные словарные ключи позже, однако это оказалось проблематичным со структурой. Поэтому я нашел следующий способ приблизиться к тому, что мне нужно.
По сути, я хочу переместить 2 клавиши selection_id и other_data на один уровень и полностью заменить словарь market_data (см. Идеальную структуру данных ниже).
Я думал, что смогу найти способ использовать setattr, но это кажется проблематичным в циклах с вложенными словарями. Кроме того, я даже не уверен, что это был правильный путь, поскольку я все равно получу все данные заранее, просто в неправильном формате.
Мой пример кода, который подходит ближе, показан ниже:
market=[{'selection_id': 1099,'value':'11', 'value_name': 'a', 'other_data': 89},
{'selection_id': 1099,'value':'78', 'value_name': 'p', 'other_data': 89},
{'selection_id': 1097,'value':'39', 'value_name': 'b', 'other_data': 89},
{'selection_id': 1097,'value':'52', 'value_name': 'f', 'other_data': 89},
{'selection_id': 1098,'value':'98', 'value_name': 'd', 'other_data': 89},
{'selection_id': 1099,'value':'13', 'value_name': 'y', 'other_data': 89},
{'selection_id': 1098,'value':'4', 'value_name': 'r', 'other_data': 89},
]
new_structure = {}
new_structure2 = []
for z in market:
new_structure.setdefault((z['selection_id'], z['other_data']), []).append({'value': z['value'], 'value_name': z['value_name']})
new_structure2.append([{'market_data': m, 'value_dict': n} for m, n in new_structure.items()])
for s in new_structure2:
for t in s:
dict = {}
dict['selection_id'] = t['market_data'][0]
dict['other_data'] = t['market_data'][1]
t['market_data'] = dict
print(new_structure2)
Приведенный выше код выдает следующее:
[[{'market_data':
{'selection_id': 1099, 'other_data': 89}, 'value_dict':
[{'value': '11', 'value_name': 'a'}, {'value': '78', 'value_name': 'p'}, {'value': '13', 'value_name': 'y'}]},
{'market_data':
{'selection_id': 1097, 'other_data': 89}, 'value_dict':
[{'value': '39', 'value_name': 'b'}, {'value': '52', 'value_name': 'f'}]}, {'market_data':
{'selection_id': 1098, 'other_data': 89}, 'value_dict':
[{'value': '98', 'value_name': 'd'}, {'value': '4', 'value_name': 'r'}]}]]
Принимая во внимание, что я ищу:
[{'selection_id': 1099, 'other_data': 89, 'value_dict':
[{'value': '11', 'value_name': 'a'}, {'value': '78', 'value_name': 'p'}, {'value': '13', 'value_name': 'y'}]},
{'selection_id': 1097, 'other_data': 89, 'value_dict':
[{'value': '39', 'value_name': 'b'}, {'value': '52', 'value_name': 'f'}]},
{'selection_id': 1098, 'other_data': 89, 'value_dict':
[{'value': '98', 'value_name': 'd'}, {'value': '4', 'value_name': 'r'}]}]
Во избежание сомнений, «other_data» всегда будет одинаковым для любого данного «selection_id», т. Е. Если есть 2 экземпляра «selection_id» = 1099, тогда «other_data» всегда будет равняться 89 для них (в примере все они 89, но в действительности могут отличаться для различных selection_id).