
本文介绍如何利用 python 的 itertools.product 和 functools.reduce 高效生成多个字典列表的全组合结果,避免嵌套循环,适用于动态数量的数据源合并场景。
本文介绍如何利用 python 的 itertools.product 和 functools.reduce 高效生成多个字典列表的全组合结果,避免嵌套循环,适用于动态数量的数据源合并场景。
在实际数据处理中,我们常需将多个独立的字典列表(如不同维度的配置、参数或枚举)进行全量笛卡尔积组合,生成所有可能的键值对组合。例如,data1 含 331 个 {"key1": i},data2 含 4 个 {"key2": j},二者组合后应得到 331 × 4 = 1324 个字典,每个字典同时包含 key1 和 key2。当列表数量从 2 个扩展到 N 个(如 data = [data1, data2, ..., dataN])时,手动嵌套循环既不可维护也不可扩展。
此时,itertools.product 是理想解法:它接受任意数量的可迭代对象(通过解包 *data),返回一个生成笛卡尔积元组的迭代器。例如:
from itertools import product
data1 = [{"key1": i} for i in range(2)]
data2 = [{"key2": i} for i in range(3)]
data3 = [{"key3": i} for i in range(2)]
data = [data1, data2, data3]
# product(*data) 生成类似:
# ({'key1': 0}, {'key2': 0}, {'key3': 0})
# ({'key1': 0}, {'key2': 0}, {'key3': 1})
# ...接下来需将每个元组中的字典合并为单个字典。推荐使用 functools.reduce 配合 operator.ior(即就地更新字典的 |= 操作符函数形式),并指定初始空字典 {} 作为累加器起点——这确保了每次合并都生成全新字典,避免意外的引用共享:
from functools import reduce
from itertools import product
from operator import ior
merged_list = [reduce(ior, dicts, {}) for dicts in product(*data)]✅ 优势说明:
- ✅ 简洁性:一行核心逻辑替代 N 层嵌套循环;
- ✅ 动态性:data 可含任意长度的列表,无需修改代码;
- ✅ 内存友好:product 返回迭代器,reduce 按需计算,适合大数据量;
- ✅ 安全性:reduce(..., {}) 始终创建新字典,杜绝原字典被意外修改。
⚠️ 注意事项:
- 若字典间存在重复键名(如多个列表都含 "id"),后出现的字典会覆盖前面的同名键值(符合 Python 字典更新语义);
- operator.ior 要求 Python ≥ 3.9(因 |= 字典操作自该版本正式支持);若需兼容更早版本,可改用 lambda a, b: {**a, **b} 替代 ior:
merged_list = [reduce(lambda a, b: {**a, **b}, dicts, {}) for dicts in product(*data)] - 笛卡尔积结果长度为各列表长度乘积(len(data1) * len(data2) * ...),请预先评估内存与计算开销,避免组合爆炸。
综上,itertools.product + functools.reduce 构成了处理多维字典组合问题的标准、健壮且可扩展的解决方案。

















