将现有字典值存入空字典后调用sum求和报int与list相加类型错误
错误产生原因
sum()函数默认初始累加值为整数0,会将初始值依次和待求和序列的每个元素执行加法操作- 你的代码执行完循环后,
twos字典的所有值都是单元素列表,twos.values()返回的内容为[[2662.0], [3646.7], [250.8]] - 求和时第一步就会执行
0 + [2662.0],整数和列表不支持加法运算,因此抛出TypeError: unsupported operand type(s) for +: 'int' and 'list'错误。
解决方案
根据使用场景,可选择以下任意一种方案:
方案1:保留当前twos结构,展开嵌套列表后求和
如果需要保留twos为每个key对应列表的结构,求和时先展开内层列表即可:
ones = {'alpha': [2662.0,80], 'beta': [3646.7,50], 'gamma': [250.8,100]} twos = {} for k,(v,q) in ones.items(): if k not in twos: twos[k] = [] twos[k].append(v) print(twos) sum_twos = sum(val for sublist in twos.values() for val in sublist) print(sum_twos)
运行后求和结果为6559.5。
方案2:调整twos的存储结构,直接存数值
如果twos不需要存为列表,直接将提取的v赋值给对应key即可,此时twos.values()返回的都是数值,可以直接用sum()求和:
ones = {'alpha': [2662.0,80], 'beta': [3646.7,50], 'gamma': [250.8,100]} twos = {} for k,(v,q) in ones.items(): twos[k] = v print(twos) sum_twos = sum(twos.values()) print(sum_twos)
方案3:省略构建twos的步骤,直接累加求和
如果你只需要最终的求和结果,不需要twos字典,可以直接在遍历ones的过程中累加数值,性能更高:
ones = {'alpha': [2662.0,80], 'beta': [3646.7,50], 'gamma': [250.8,100]} sum_twos = 0 for k,(v,q) in ones.items(): sum_twos += v print(sum_twos)
内容的提问来源于stack exchange,提问作者Praveen Paliwal
相关产品推荐
相关产品推荐

