我有2个dict列表,每个列表中都包含进一步的嵌套,下面称为original_state
的dicts第一个列表是(如它所暗示的)服务器开机时收到的初始状态。
脚本执行(这是获取初始状态的方式),并继续寻找更新。这些更新以下面updated_orders
的形式定期进行(这一切都正常运行)。
我正在尝试(并且惨遭失败)尝试编写一个函数,该函数查看字典updated_orders
的列表,然后将这些订单添加到original_state
中的正确位置。正确的位置由“ selection_id”和“ market_id”确定。
注意事项:
1)updated_orders
中可能存在original_state
中不存在的selection_id(大多数情况下,情况恰恰相反,因为只有当订单进入时才会返回订单,因此大多数{ {1}}在original_state
中将没有对应的值,但这并不重要,因为updated_orders
不需要更新。)
2)当selection_id位于updated_orders
中而不是updated_orders
中时,应添加一个新条目,当两个selection_id都位于时,则应插入任何新的order_id,并覆盖所有现有的order_id(如果不同)
3)上面的内容也适用于Market_id(它增加了一个全新的复杂度,因此,请暂时忽略此,因为这是一种相对不太可能的情况,我可以通过线下和/或其他方式来处理)方法)。
3)order_id完全唯一
4)market_id完全唯一
5)一个selection_id可能出现在多个市场中
6)如果有帮助,market_id是{selection_id“旁边original_state
中可用的字段(在我提供的示例数据集中被省略)
我认为这就是逻辑,希望我已经清楚地解释了,但是请随时提出任何澄清要求。
现在令人尴尬的是...我通常会发布大量的代码片段供人们批评,但是在这里我什至不知道从哪里开始,所以尽管我尝试了很多方法,但我的语法从未有效,因此我几乎没有任何进展。
我显然不希望有人为我编写所有内容,因此,如果有人友好地给我一个指针,我可以希望完成该功能并发布最终代码,以帮助其他遇到类似问题的人。
live_orders
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}]}]}]}]
我想知道我是否已经过分复杂化了,上面的内容似乎按照我的要求进行了过滤(我认为),所以下一步就是用{{1}更新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'])
}基于上述选择。
答案 0 :(得分:0)
在这里,我可能已经过于复杂化了,这似乎可以满足我的要求(暂时不考虑插入全新的市场/ 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)