У меня есть 2 списка диктов, оба с дальнейшим вложением, первый список диктов, именуемый original_state
, ниже (как и предполагает) начальное состояние, полученное при включении сервера.
Сценарий выполняется (именно так получается исходное состояние) и продолжает поиск обновлений.Эти обновления периодически проходят в форме updated_orders
ниже (это все работает правильно).
Я пытаюсь (и терпит неудачу) попытаться написать функцию, которая просматривает список диктов updated_orders
и затем добавляет эти заказы в правильное место в пределах original_state
.Правильное место определяется 'selection_id' и 'market_id'.
Что нужно учитывать:
1) В updated_orders
могут быть значения selection_id, которых нет в original_state
(в большинстве случаев обратное будет верно, поскольку ордера возвращаются только тогда, когда они поступают, следовательно, большинство selection_id в original_state
не будет иметь соответствующего значения в updated_orders
, но это менее важно, поскольку updated_orders
не нужнодолжно быть обновлено).
2) Когда selection_id находится в updated_orders
, а не в original_state
, должна быть добавлена новая запись, когда selection_id есть в обоих, тогда должны быть вставлены любые новые order_id и любые существующиеперезаписываются, если отличаются.
3) Вышеуказанное также применимо к Market_id (который добавляет совершенно новый уровень сложности, поэтому, пожалуйста, не стесняйтесь пока игнорировать это, поскольку это относительно маловероятный сценарий, с которым я могу иметь деловниз по линии и / или другим способом).
3) Order_id является полностью уникальным
4) market_id является полностью уникальным
5) Aselection_id может встречаться более чем на одном рынке
6) Если это помогает, market_id - это доступное поле для использования в пределах live_orders
рядом с 'selection_id' (оно опущено в примере набора данных, который я дал)
Я думаю, что это вся логика, надеюсь, я объяснил это ясно, но, пожалуйста, не стесняйтесь просить разъяснений по чему-либо.
Теперь немного неловко ... Я обычно выкладываюобширный фрагмент кода для критики, однако здесь я действительно даже не знаю, с чего начать, поэтому, хотя я пробовал множество способов, мой синтаксис никогда не был действительным, поэтому я практически не продвинулся.
Я, очевидно, не ожидаю, что кто-нибудь напишет все для меня, поэтому, если кто-то проявит любезность и даст мне указатель, я надеюсь, что смогу завершить функцию и опубликовать окончательный код, чтобы помочь кому-то еще с подобной проблемой.
original_state = [{'Market_id': '1.130856098', 'Market_name': 'Market A', 'position_list':
[{'Market_id': '1.130856098', 'Selection_id': 12832765, 'Last_price': 4.1,
'Orders':
[{'order_id': '163785114305', 'price': 100, 'size': 5.0},
{'order_id': '173785114311', 'price': 99, 'size': 5.0}], 'Status': 'ACTIVE'},
{'Market_id': '1.130856099', 'Selection_id': 12832767, 'Last_price': 4.1,
'Orders':
[{'order_id': '163785114305', 'price': 100, 'size': 5.0},
{'order_id': '173785114311', 'price': 99, 'size': 5.0}], 'Status': 'ACTIVE'}]},
{'Market_id': '1.130856099', 'Market_name': 'Market B', 'position_list':
[{'Market_id': '1.130856099', 'Selection_id': 12832765, 'Last_price': 4.1,
'Orders':
[{'order_id': '163785114305', 'price': 100, 'size': 5.0},
{'order_id': '173785114311', 'price': 99, 'size': 5.0}], 'Status': 'ACTIVE'},
{'Market_id': '1.130856099', 'Selection_id': 12832763, 'Last_price': 4.1,
'Orders':
[{'order_id': '163785114305', 'price': 100, 'size': 5.0},
{'order_id': '173785114311', 'price': 99, 'size': 5.0}],
'Status': 'ACTIVE'}]}]
updated_orders=[{'Last_update': 'Mon May 20 18:23:38 2019', 'Market_id': '1.130856098', 'Market_name': 'Market A',
'Live_orders':
[{'selection_id': 12832765, 'live_orders':
[{'order_id': '165150568348', 'price': 55.5, 'size': 3},
{'order_id': '165147033010', 'price': 46, 'size': 12}]},
{'selection_id': 12832767, 'live_orders':
[{'order_id': '165150568333', 'price': 32, 'size': 3.5},
{'order_id': '165147033055', 'price': 67, 'size': 7.8}]}]},
{'Last_update': 'Mon May 20 18:23:38 2019', 'Market_id': '1.130856099', 'Market_name': 'Market B',
'Live_orders':
[{'selection_id': 12832765, 'live_orders':
[{'order_id': '165150568348', 'price': 55.5, 'size': 54},
{'order_id': '165147033010', 'price': 46, 'size': 9}]},
{'selection_id': 12832766, 'live_orders':
[{'order_id': '165150568349', 'price': 56, 'size': 6},
{'order_id': '165147033011', 'price': 47, 'size': 32}]}]}]}]
new_order_list = []
for x in updated_orders:
for y in x['Live_orders']:
orders_to_update = {}
orders_to_update.update({'Market_id': x['Market_id'],
'Selection_id': y['selection_id'],
'live_orders': y['live_orders']})
new_order_list.append(orders_to_update)
for z in new_order_list:
for a in original_state:
for b in a['position_list']:
if z['Market_id'] == b['Market_id'] and z['Selection_id'] == b['Selection_id']:
print(z['Market_id'], z['Selection_id'])
Интересно, если бы я чрезмерно усложнил это, вышеприведенное, кажется, отфильтровывает способ (я думаю), который я требую,поэтому следующим шагом будет обновление original_state
на updated_orders
на основе вышеуказанных вариантов.