【问题标题】:Fastest way to update one big dictionary with another dictionary values if one of the values matches in both dictionaries?如果两个字典中的一个值匹配,则用另一个字典值更新一个大字典的最快方法?
【发布时间】:2018-07-15 14:51:08
【问题描述】:

我正在使用 Python 3.5

我有一本字典,其中包含数千个其他较小字典的列表,看起来像这样:

bookSnapshot = {
 'ask':[{'Price': 0.013, 'Size': 0.005},{'Price': 0.014, 'Size': 0.009},{...}...], 
 'bid':[{'Price': 0.012, 'Size': 0.005},{'Price': 0.011, 'Size': 0.006},{...}...]
}

这是我在创建 Websocket 连接时从服务器得到的响应。

之后,服务器将向我发送有关字典中任何更改的更新。这看起来与上面的字典完全一样,只是小了一点。

bookUpdate = {
 'ask':[{'Price': 0.013, 'Size': 0.005}], 
 'bid':[{'Price': 0.012, 'Size': 0.000}]
}

我想更新任何“询问”或“出价”字典“价格”值与 bookUpdate 字典“出价”或“询问”“价格”值匹配的 bookSnapshot。如果“大小”为 0,则从“询问”或“出价”值中删除字典。

遍历这两个字典会花费太长时间。最好的方法是什么?

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    这对于字典列表将是低效的。您可以改用 Pandas 等第三方库来执行矢量化操作:

    bookSnapshot = {
     'ask':[{'Price': 0.013, 'Size': 0.005},{'Price': 0.014, 'Size': 0.009}], 
     'bid':[{'Price': 0.012, 'Size': 0.005},{'Price': 0.011, 'Size': 0.006}]
    }
    
    bookUpdate = {
     'ask':[{'Price': 0.013, 'Size': 0.006}], 
     'bid':[{'Price': 0.012, 'Size': 0.000}]
    }
    
    import pandas as pd
    
    df_Snapshot = {k: pd.DataFrame(v) for k, v in bookSnapshot.items()}
    df_Update = {k: pd.DataFrame(v).set_index('Price')['Size'] for k, v in bookUpdate.items()}
    
    for k, v in df_Snapshot.items():
        v['Size'] = v['Price'].map(df_Update[k]).fillna(v['Size'])
        v = v[v['Size'] != 0]
        df_Snapshot[k] = v
    
    print(df_Snapshot)
    
    {'ask':    Price   Size
    0  0.013  0.006
    1  0.014  0.009,
     'bid':    Price   Size
    1  0.011  0.006}
    

    然后使用字典推导转换回您想要的结果:

    res = {k: v.to_dict('records') for k, v in df_Snapshot.items()}
    
    {'ask': [{'Price': 0.013, 'Size': 0.006}, {'Price': 0.014, 'Size': 0.009}],
     'bid': [{'Price': 0.011, 'Size': 0.006}]}
    

    【讨论】:

    • 谢谢,这不仅有助于解决这个问题,而且指出了我需要在 Python 中学习的下一个东西。很好的建议。 :)
    猜你喜欢
    • 2022-11-22
    • 2021-09-03
    • 2017-08-05
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多