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

如何从多个字典生成所有键组合并计算对应值的总和?

多字典键组合生成新字典问题

问题说明

假设有n个不同大小的字典(最多18个),每个字典都以字符串为键、正数为值。需要生成一个新字典dictComb,它的键是从每个字典中各取一个键组成的所有组合(用空格拼接),对应的值是这些键对应值的总和。

示例(n=2)

dictA = {"Beefsteak": 20, "Campari": 100}
dictB = {"McIntosh": 5, "Fuji": 11, "Honeycrisp": 32}

# 预期结果
dictComb = {
    "Beefsteak McIntosh": 25, "Beefsteak Fuji": 31, "Beefsteak Honeycrisp": 52,
    "Campari McIntosh": 105, "Campari Fuji": 111, "Campari Honeycrisp": 132
}

错误代码及结果

我尝试了这段代码:

dictComb = {}
for (a, b) in zip(dictA, dictB):
     dictComb.update({" ".join([a, b]): sum([dictA[a], dictB[b]])})

得到的结果却不对:

dictComb = {"Beefsteak McIntosh": 25, "Campari Fuji": 111}

问题出在哪

zip()是按位置配对两个可迭代对象的元素,当两个字典长度不一样时,只会配对到较短字典的长度为止。这里dictA有2个键,dictB有3个,所以zip只生成了2组配对,而且是按顺序取第一个对第一个、第二个对第二个,直接漏掉了dictB的第三个键,也没生成dictA每个键和dictB所有键的组合。

正确解决方法

针对n=2的场景

用双重循环遍历两个字典的键值对,生成所有可能的组合:

dictComb = {}
for key_a, val_a in dictA.items():
    for key_b, val_b in dictB.items():
        combined_key = f"{key_a} {key_b}"
        dictComb[combined_key] = val_a + val_b

这样就能得到2×3=6组正确的键值对,和预期结果一致。

支持最多18个字典的通用方法

当字典数量不确定(最多18个)时,用itertools.product()生成所有字典键的笛卡尔积,再计算对应值的总和:

from itertools import product

# 把所有要组合的字典放到一个列表里,比如有3个字典就写[d1, d2, d3]
dicts = [dictA, dictB]

dictComb = {}
# 生成所有字典键的笛卡尔积,每个元素是一组跨字典的键组合
for keys in product(*[d.keys() for d in dicts]):
    combined_key = " ".join(keys)
    # 遍历每个字典和对应的键,累加值
    total = sum(d[key] for d, key in zip(dicts, keys))
    dictComb[combined_key] = total

这个方法不管n是2还是18都能用,product会自动生成所有可能的键组合,完全覆盖需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:05:15