如何从多个字典生成所有键组合并计算对应值的总和?
多字典键组合生成新字典问题
问题说明
假设有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_
相关产品推荐
相关产品推荐

