我正在使用 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”值与 bookUpdate 字典“bid”或“ask”“Price”值匹配的 bookSnapshot。如果“大小”为 0,则从“要价”或“出价”值中删除字典。
迭代这两个字典会花费太长时间。最好的方法是什么?
最佳答案
这对于字典列表来说效率很低。您可以使用第三方库(例如 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 - 如果其中一个值在两个字典中都匹配,则用另一个字典值更新一个大字典的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51349508/