如何遍历字典实现各值列表元素的全组合遍历操作?
如何遍历字典中所有值列表的全组合情况?
看起来你需要生成字典里每个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(字典不保证顺序),可以先对字典的键排序,再提取对应的值,比如:
这样组合的顺序就会按Source_1、Source_2的顺序排列。sorted_keys = sorted(a.keys()) source_values = [a[key] for key in sorted_keys]
方法二:手动递归实现(适合理解原理)
如果你不想依赖标准库,也可以自己写递归函数生成所有组合,这能帮你理解笛卡尔积的生成逻辑:
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
相关产品推荐
相关产品推荐

