如何将一个嵌套的Dicts列表与另一个嵌套的Dicts列表进行比较,并从另一个中更新值

时间:2019-05-20 20:07:54

标签: python list dictionary nested

我有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']) }基于上述选择。

1 个答案:

答案 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)