我正在使用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'值中删除字典。
对两个词典进行迭代将花费太长时间。最好的方法是什么?
答案 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}]}