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

如何基于列表中的键组合对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],需修正代码实现需求。

修正方案

原代码问题分析

  1. 循环对象错误:原代码遍历字典的键值对,但实际应遍历mylist中的每个键组合
  2. 成员判断逻辑错误:k in mylist是判断单个键是否在元组列表中,而mylist的元素是元组(比如('B',)),永远无法匹配单个字符键
  3. 求和方式错误:直接对列表调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:03:31