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

如何遍历字典实现各值列表元素的全组合遍历操作?

如何遍历字典中所有值列表的全组合情况?

看起来你需要生成字典里每个Source对应列表元素的笛卡尔积——也就是穷尽所有可能的元素搭配,每个组合里包含每个Source列表中的一个元素,然后对每个组合执行操作对吧?

Python里最简洁高效的方式就是用标准库的itertools.product,下面给你具体的实现方案:

方法一:用itertools.product(推荐)

这是Python官方提供的工具,专门用来生成多个可迭代对象的笛卡尔积,代码简洁且性能拉满:

import itertools

# 你的原始字典
a = {'Source_1': [1, 2], 'Source_2': [7, 8, 9, 10], 'Source_3': [11, 12, 13, 14]}

# 提取所有Source对应的列表(Python 3.7+字典默认保留插入顺序)
source_values = list(a.values())

# 生成所有可能的组合
all_combinations = itertools.product(*source_values)

# 遍历每个组合并执行你的操作
for combo in all_combinations:
    # 示例:打印当前组合
    print(f"当前组合:{combo}")
    
    # 如果你需要明确知道每个值对应的Source,可以转成字典
    combo_with_keys = dict(zip(a.keys(), combo))
    print(f"带键的组合:{combo_with_keys}")
    
    # 这里替换成你实际要执行的操作,比如计算总和、写入文件等
    # do_something(combo_with_keys)

关键点说明:

  • itertools.product(*source_values) 中的*是解包操作,把每个列表作为单独的参数传入product,这样它就会生成所有可能的元素组合。
  • 如果你使用的Python版本低于3.7(字典不保证顺序),可以先对字典的键排序,再提取对应的值,比如:
    sorted_keys = sorted(a.keys())
    source_values = [a[key] for key in sorted_keys]
    
    这样组合的顺序就会按Source_1、Source_2的顺序排列。

方法二:手动递归实现(适合理解原理)

如果你不想依赖标准库,也可以自己写递归函数生成所有组合,这能帮你理解笛卡尔积的生成逻辑:

def generate_all_combinations(dict_items):
    # 递归终止条件:没有更多Source了,返回空字典
    if not dict_items:
        yield {}
        return
    
    # 取出第一个Source及其对应的列表
    current_key, current_values = dict_items[0]
    
    # 递归生成剩余Source的所有组合
    for rest_combination in generate_all_combinations(dict_items[1:]):
        # 给每个剩余组合添加当前Source的每个元素
        for val in current_values:
            combo = rest_combination.copy()
            combo[current_key] = val
            yield combo

# 你的原始字典
a = {'Source_1': [1, 2], 'Source_2': [7, 8, 9, 10], 'Source_3': [11, 12, 13, 14]}
# 把字典转成键值对列表,方便递归处理
dict_items = list(a.items())

# 遍历所有组合并执行操作
for combo in generate_all_combinations(dict_items):
    print(f"当前组合:{combo}")
    # 执行你的操作
    # process_combination(combo)

说明:

递归的思路是把问题拆解成“当前Source的每个元素” + “剩余Source的所有组合”,逐步构建出全量组合。不过实际开发中还是优先用itertools.product,它是经过优化的C实现,速度比手写递归快很多,尤其是当列表元素很多的时候。


内容的提问来源于stack exchange,提问作者J. Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:37:32