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

如何扩展Python代码实现嵌套列表字典的笛卡尔积生成?

扩展字典笛卡尔积生成函数以支持嵌套结构

这是个很实用的需求!我们可以用递归的方式来扩展原来的函数,轻松处理嵌套字典的笛卡尔积生成。下面是简洁的实现方案:

实现代码

import itertools

def gen_nested_combinations(d):
    # 预处理每个键对应的值:嵌套字典则递归生成所有组合,普通列表直接保留
    processed_items = []
    for key, value in d.items():
        if isinstance(value, dict):
            # 递归获取嵌套字典的所有可能组合,作为当前键的可选值集合
            nested_options = list(gen_nested_combinations(value))
            processed_items.append((key, nested_options))
        else:
            # 非字典类型(这里假设是列表)直接作为可选值
            processed_items.append((key, value))
    
    # 拆分键列表和对应的值选项列表
    keys, value_options = zip(*processed_items)
    # 生成所有笛卡尔积组合并转换为字典返回
    for combo in itertools.product(*value_options):
        yield dict(zip(keys, combo))

思路解释

核心逻辑是递归处理嵌套结构:

  • 遍历输入字典的每个键值对,如果值是字典,就递归调用自身生成该子字典的所有笛卡尔积组合,把这些组合作为当前键的可选值;
  • 如果值是普通列表,直接保留作为可选值;
  • 最后对所有键的可选值集合做笛卡尔积,再将每个组合打包成对应的嵌套字典结构。

这种方式不仅支持两层嵌套,还能处理任意深度的嵌套字典(只要最内层是列表即可),完全满足你的需求。

测试示例

1. 嵌套字典测试

B = {'s1': {'a': [0, 1], 'b': [0, 1, 2] }, 's2': {'c': [0, 1], 'd': [0, 1] }}
for idx, combo in enumerate(gen_nested_combinations(B), 1):
    print(f"组合 {idx}: {combo}")

输出会包含24种组合(s1的6种 × s2的4种),每个组合的结构类似:

组合 1: {'s1': {'a': 0, 'b': 0}, 's2': {'c': 0, 'd': 0}}
组合 2: {'s1': {'a': 0, 'b': 0}, 's2': {'c': 0, 'd': 1}}
...
组合 24: {'s1': {'a': 1, 'b': 2}, 's2': {'c': 1, 'd': 1}}

2. 兼容原扁平字典

原来的扁平字典也能直接使用这个函数,比如:

A = {'a': [0, 1], 'b': [2, 3, 4]}
for combo in gen_nested_combinations(A):
    print(combo)

输出和原函数完全一致:

{'a': 0, 'b': 2}
{'a': 0, 'b': 3}
{'a': 0, 'b': 4}
{'a': 1, 'b': 2}
{'a': 1, 'b': 3}
{'a': 1, 'b': 4}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:17:57