Python作业求助:将含重复键的字典转换为值求和的列表
解决字典重复键值求和的问题
嘿,我懂你现在的困惑!你用字典推导式生成d2的时候,因为字典的键是唯一不可重复的,所以后面出现的重复键会直接覆盖前面的对应值,这就是为啥没法实现求和的原因啦~
方法一:基础循环判断
最直观的方式就是初始化一个空字典,然后遍历每一组索引和值,手动判断键是否存在来累加:
d1 = {'inds': [0, 3, 7, 3, 3, 5, 1], 'vals': [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]} d2 = {} for k, v in zip(d1["inds"], d1["vals"]): if k in d2: # 如果键已存在,就把当前值加到已有值上 d2[k] += v else: # 如果键不存在,直接存入键值对 d2[k] = v print(d2) # 输出:{0: 1.0, 3: 11.0, 7: 3.0, 5: 6.0, 1: 7.0}
方法二:用collections.defaultdict简化代码
Python的标准库collections里有个defaultdict,可以自动为不存在的键设置默认值,写起来更简洁:
from collections import defaultdict d1 = {'inds': [0, 3, 7, 3, 3, 5, 1], 'vals': [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]} # 初始化一个默认值为0.0的defaultdict d2 = defaultdict(float) for k, v in zip(d1["inds"], d1["vals"]): # 不管键是否存在,直接累加就行,不存在的话会自动用默认值0.0加v d2[k] += v # 如果需要转换成普通字典,用dict()包裹即可 print(dict(d2)) # 输出和上面一样:{0: 1.0, 3: 11.0, 7: 3.0, 5: 6.0, 1: 7.0}
为啥原来的字典推导式不行?
字典推导式{k:v for k,v in zip(d1["inds"],d1["vals"])}在处理重复键时,只会保留最后一次出现的键值对。比如你的例子里,键3先后对应2.0、4.0、5.0,推导式最终只会把3对应的值设为最后一个5.0,自然没法实现求和啦。
内容的提问来源于stack exchange,提问作者Jane P
相关产品推荐
相关产品推荐

