Как сравнить вложенный список Dicts с другим вложенным списком Dicts и обновить значения в одном из другого - PullRequest
0 голосов
/ 20 мая 2019

У меня есть 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 на основе вышеуказанных вариантов.

1 Ответ

0 голосов
/ 21 мая 2019

Я, может быть, слишком сильно усложнял ситуацию, похоже, это делает то, что я хочу (пока игнорируя вставку совершенно новых рынков / selection_id):

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']:
                    #for c in b['Orders']:
                    print(b['Market_id'], b['Selection_id'], z['live_orders'])
                    b.update({'Orders': z['live_orders']})

Я, должно быть, упустил очевидное решениеи искал что-то слишком сложное, но, надеюсь, это поможет кому-то еще, поскольку это должно быть довольно распространенной проблемой (но с очень небольшим количеством сообщений о решении)!

Вот как я справился с обновлениями, гдезаказов не было в original_state:

uo_list = []

for i in updated_orders:
    uo_list.append(i['Market_id'])

os_list = []

for j in original_state:
    os_list.append(j['Market_id'])

new_list = list(set(uo_list).difference(os_list))

for i in updated_orders:
    for j in new_list:
        if i['Market_id'] == j:
            print('Append this as required', i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...