【发布时间】:2019-10-07 05:05:14
【问题描述】:
我有 2 个 dicts 列表,它们都进一步嵌套,下面称为 original_state 的第一个 dicts 列表是(正如它所暗示的)服务器打开时收到的初始状态。
脚本执行(这是获取初始状态的方式)并继续寻找更新。这些更新以下面updated_orders 的形式定期通过(这一切正常)。
我正在尝试(并且失败得很惨)尝试编写一个函数来查看字典列表updated_orders,然后将这些命令添加到original_state 中的正确位置。正确的位置由“selection_id”和“market_id”确定。
需要考虑的事项:
1) updated_orders 中可能存在 original_state 中不存在的 selection_id(反之亦然,因为订单仅在进来时才会返回,因此 original_state 中的大多数 selection_id 不会在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) selection_id 可能出现在多个市场中
6) 如果有帮助,market_id 是live_orders 中“selection_id”旁边的可用字段(在我给出的示例数据集中省略)
我认为这就是所有的逻辑,希望我已经解释清楚了,但请随时要求澄清任何事情。
现在有点尴尬...我通常会发布一个广泛的代码 sn-p 供人们批评,但是在这里我真的什至不知道从哪里开始,所以尽管我尝试了很多方法,但我的语法从未是有效的,因此我几乎没有取得任何进展。
我显然不希望任何人为我编写所有内容,所以如果有人好心给我指点,我希望可以完成该功能并发布最终代码以帮助其他有类似问题的人。
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'])
我想知道我是否已经过分复杂化了,上面似乎以我需要的方式过滤(我认为),所以下一步是根据 updated_orders 更新 original_state以上选择。
【问题讨论】:
-
很抱歉为我重新格式化数据集的人,我注意到一个错误,因为我试图做同样的事情并且似乎覆盖了你的努力。
-
对于那些根据格式投反对票的人...给我一两分钟,我正在尝试纠正它!
-
希望现在看起来更具可读性!
标签: python list dictionary nested