Как переместить 2 ключа / значения во вложенном Dict на один уровень выше в Python - PullRequest
0 голосов
/ 16 мая 2019

Вчера у меня возникла проблема с реструктуризацией списка диктовок здесь (я упоминаю, если это помогает кому-то еще, имеющему подобную проблему):

Перестройка списка 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).

1 Ответ

1 голос
/ 16 мая 2019

Это один подход.

Пример:

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},
]

result = {}
for i in market:
    if i["selection_id"] not in result:
        result[i["selection_id"]] = {'selection_id': i["selection_id"], 'other_data': i["other_data"], 'value_dict': []}
    result[i["selection_id"]]["value_dict"].append({'value': i["value"], "value_name": i["value_name"]})


print(list(result.values()))

Выход:

[{'other_data': 89,
  'selection_id': 1097,
  'value_dict': [{'value': '39', 'value_name': 'b'},
                 {'value': '52', 'value_name': 'f'}]},
 {'other_data': 89,
  'selection_id': 1098,
  'value_dict': [{'value': '98', 'value_name': 'd'},
                 {'value': '4', 'value_name': 'r'}]},
 {'other_data': 89,
  'selection_id': 1099,
  'value_dict': [{'value': '11', 'value_name': 'a'},
                 {'value': '78', 'value_name': 'p'},
                 {'value': '13', 'value_name': 'y'}]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...