【问题标题】:How to compare a nested list of Dicts to another nested list of Dicts and update the values in one from the other如何将嵌套的字典列表与另一个嵌套的字典列表进行比较,并从另一个中更新一个中的值
【发布时间】: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


【解决方案1】:

我可能在这里把事情复杂化了,这似乎是我想要的(暂时忽略全新市场/ 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)

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多