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

标签 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”值与 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/

相关文章:

Python-从文件中读取两个列表作为列表

python - 如何更改 Pandas 查找自己的文件(特别是 parsers.pyx)的位置?

python - 如何在 Pandas 数据框中将日期转换为 ISO-8601 DateTime 格式

python - for 循环不正确循环

python - 按已知子字符串拆分字符串

python - 使用分隔符列出的列

python - 将 3 列数据框转换为矩阵

python - NoseGAE 无法在应用程序根目录中导入 .py 文件

结合 `for` 和 `try` block 的 Pythonic 方式

C 程序错误 - 段错误(核心已转储)