如果两个字典中的一个值匹配,用另一种字典值更新一个大字典的最快方法?

时间:2018-07-15 14:51:09

标签: python python-3.x list dictionary

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

我想更新任何'ask'或'bid'词典'price'值的bookSnapshot与bookUpdate词典'bid'或'ask''Price'值相匹配。如果'Size'为0,则从'ask'或'bid'值中删除字典。

对两个词典进行迭代将花费太长时间。最好的方法是什么?

1 个答案:

答案 0 :(得分: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}]}