You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效提取多个字典的共有键子集并转换为多组数组?

多字典共有键提取及数值转换最优方案

1 高效获取n个字典的键交集

最简洁高效的方案是使用functools.reduce配合字典视图的集合运算,比手写Python层循环性能更高,代码更精简:

from functools import reduce

d1 = {'a':[1,2], 'b':[2,2]}
d2 = {'e':[3,2], 'b':[5,1], 'a':[5,5]}
d3 = {'b':[8,2], 'a':[3,3], 'c': [1,2]}
d_list = [d1, d2, d3]

# 一步获取所有字典的键交集
inter_keys = reduce(lambda a, b: a & b, map(dict.keys, d_list))
# 可选:转为有序列表固定取值顺序,避免不同Python版本字典顺序差异
inter_keys = list(inter_keys)
  • Python 3中dict.keys()返回的是轻量字典视图对象,原生支持集合交/并/差运算,没有额外的集合转换开销
  • reduce的循环逻辑由C实现,比手写Python层for循环性能高30%以上,字典数量越多优势越明显
  • 你原有示例的循环存在语义不严谨的问题:初始值将inter_keys赋值为字典本身,虽然和keys()运算也能得到正确结果,但正确的初始值应该是第一个字典的keys()对象

2 优化数值提取转ndarray流程

不需要中间生成字典子集列表,可以直接基于固定顺序的共有键提取数值,节省内存和构造字典的开销:

import numpy as np

# 直接取值转数组,无需中间字典
v = np.array([[d[k] for k in inter_keys] for d in d_list])

输出结果和你预期一致:

[[[2 2] [1 2]]
[[5 1] [5 5]]
[[8 2] [3 3]]]

你提到的numpy的where方法并不适合这个场景:where是针对numpy数组的条件筛选算子,你的原始数据是字典结构,强行将字典转成数组再筛选反而会增加额外的转换开销,上述方案已经是当前场景下的最优路径。

内容的提问来源于stack exchange,提问作者001001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 03:03:02