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

如何用递归实现字典中不同长度列表元素的全组合?

递归实现字典列表元素的全组合

这问题我熟!递归确实是实现这种通用组合生成的好办法,不用像嵌套循环那样,每多一个键就要加一层循环,代码能自动适配任意数量的键值对。

直接输出结果的递归实现

bob = {'a':['a','b','c'], 'b':[0], 'c':['x','y']}

def recursive_combine(dict_items, current_combo=None):
    # 初始化当前组合,第一次调用时为空列表
    if current_combo is None:
        current_combo = []
    
    # 递归终止条件:没有剩余的列表需要处理,输出当前组合
    if not dict_items:
        print(" - ".join(str(item) for item in current_combo))
        return
    
    # 取出第一个键对应的列表,剩下的键值对留给下一轮递归处理
    first_key, first_list = dict_items[0]
    remaining_items = dict_items[1:]
    
    # 遍历当前列表的每个元素,把它加到现有组合中,递归处理剩余列表
    for item in first_list:
        recursive_combine(remaining_items, current_combo + [item])

# 把字典转换成键值对列表传入函数(顺序和原字典一致)
recursive_combine(list(bob.items()))

代码逻辑解释

  1. 初始状态:第一次调用函数时,current_combo设为空列表,dict_items是字典的所有键值对。
  2. 终止条件:当所有键值对都处理完(dict_items为空),就把当前积累的组合转换成你需要的格式输出。
  3. 递推过程:每次取出第一个列表,遍历它的每个元素,把元素追加到当前组合末尾,然后递归处理剩下的键值对。这样每一层递归都会处理一个列表,直到所有列表都被遍历完。

进阶版:返回所有组合的列表

如果不想直接打印,而是想先获取所有组合的列表再做后续处理,可以修改函数:

def get_all_combinations(dict_items, current_combo=None):
    if current_combo is None:
        current_combo = []
    # 终止条件:返回当前组合的单元素列表
    if not dict_items:
        return [current_combo]
    
    first_key, first_list = dict_items[0]
    remaining_items = dict_items[1:]
    all_combos = []
    
    # 遍历元素,收集所有递归返回的组合
    for item in first_list:
        all_combos.extend(get_all_combinations(remaining_items, current_combo + [item]))
    
    return all_combos

# 使用示例
combinations = get_all_combinations(list(bob.items()))
for combo in combinations:
    print(" - ".join(str(item) for item in combo))

这个版本会返回一个包含所有组合的二维列表,你可以根据需求灵活处理这些组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:13:17