如何基于列表中的键组合对Python字典执行逐元素值求和?
问题描述
给定以下字典和列表:
mylist=[('B',), ('D',), ('B', 'D'), ('B', 'J'), ('B', 'P'), ('B', 'M'), ('D', 'J'), ('D', 'P'), ('D', 'M'), ('J', 'P'), ('J', 'M'), ('P', 'M'), ('B', 'D', 'J'), ('B', 'D', 'P'), ('B', 'D', 'M')] my_dict={'B': [1, 0, 1, 1], 'D': [1, 1, 0, 1], 'J': [0, 0, 1, 1], 'P': [1, 1, 0, 1], 'M': [1, 0, 0, 1]}
需要根据mylist中的键组合,对my_dict中对应键的列表值进行逐元素求和,最终得到每个键组合对应的求和结果元组列表(例如预期结果:[(1,0,1,1), (1,1,0,1), (2,1,1,2), ...])。
原代码如下:
myresult=[] for k,v in dict.items(): row=sum(v for k, v in dict.items() if k in mylist) myresult.append(row)
运行后得到错误结果[0,0,0,0,0],需修正代码实现需求。
修正方案
原代码问题分析
- 循环对象错误:原代码遍历字典的键值对,但实际应遍历
mylist中的每个键组合 - 成员判断逻辑错误:
k in mylist是判断单个键是否在元组列表中,而mylist的元素是元组(比如('B',)),永远无法匹配单个字符键 - 求和方式错误:直接对列表调用
sum()会尝试把列表当作数值相加,无法实现逐元素求和
正确代码
myresult = [] # 遍历mylist中的每个键组合 for combo in mylist: # 取出组合中每个键对应的列表 lists_to_sum = [my_dict[key] for key in combo] # 逐元素求和:用zip把各列表对应位置的元素打包,再对每个位置的元素求和 summed = tuple(sum(items) for items in zip(*lists_to_sum)) myresult.append(summed)
代码说明
- 遍历
mylist中的每个元组(键组合),比如('B', 'D') - 从字典中取出该组合内所有键对应的列表,得到
[[1,0,1,1], [1,1,0,1]] - 使用
zip(*lists_to_sum)将多个列表的对应位置元素打包成元组,比如(1,1), (0,1), (1,0), (1,1) - 对每个打包后的元组求和,再转成元组,得到
(2,1,1,2)并加入结果列表
运行后即可得到符合预期的结果:
[(1, 0, 1, 1), (1, 1, 0, 1), (2, 1, 1, 2), (1, 0, 2, 2), (2, 1, 1, 2), (2, 0, 1, 2), (1, 1, 1, 2), (2, 2, 0, 2), (2, 1, 0, 2), (1, 1, 1, 2), (1, 0, 1, 2), (2, 1, 0, 2), (2, 1, 2, 3), (3, 2, 1, 3), (3, 1, 1, 3)]
内容的提问来源于stack exchange,提问作者Py-enthusiast
相关产品推荐
相关产品推荐

