如果一个值在两个字典中都匹配,用另一个字典值更新一个大字典的最快方法是什么?

2024-05-14 22:34:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python3.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}]
}

我想更新任何'ask'或'bid'字典'Price'值的bookSnapshot与bookUpdate字典'bid'或'ask'Price'值匹配。如果“Size”为0,则从“ask”或“bid”值中删除字典。你知道吗

反复阅读这两本词典会花费很长时间。最好的办法是什么?你知道吗


Tags: 服务器size字典pricewebsocketask花费办法
1条回答
网友
1楼 · 发布于 2024-05-14 22:34:40

这将是一个字典列表效率低下。您可以使用第三方库(如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}]}

相关问题 更多 >

    热门问题