如何遍历字典多键等长列表值,完成加权求和并适配未知键数?
用NumPy/Pandas处理动态键的字典加权求和问题
问题场景
给定两个字典:
my_dict1 = {'c1': [10, 11, 12], 'c2': [100, 110, 120], 'c3': [200, 210, 220]} my_dict2 = {'c1': 3, 'c2': 1, 'c3': 2}
其中my_dict1所有键对应的列表长度一致,需要完成以下计算:
- 遍历每个索引位置,计算该位置下所有键的列表元素与
my_dict2对应键标量的乘积之和 - 将所有索引的求和结果相加后乘以0.5,最终公式为:
result = 0.5 * ([10 * 3 + 100 * 1 + 200 * 2] + [11 * 3 + 110 * 1 + 210 * 2] + [12 * 3 + 120 * 1 + 220 * 2])
要求方案支持未知数量键的实际业务场景,可使用NumPy或Pandas实现。
方法一:NumPy实现(高效数值计算)
通过数组转换与矩阵运算,自动适配任意数量的匹配键:
import numpy as np my_dict1 = {'c1': [10, 11, 12], 'c2': [100, 110, 120], 'c3': [200, 210, 220]} my_dict2 = {'c1': 3, 'c2': 1, 'c3': 2} # 提取共同键(实际业务中可添加键一致性校验) keys = my_dict1.keys() # 将my_dict1的列表转换为二维数组,转置后每行对应一个索引位置的所有元素 arr = np.array([my_dict1[k] for k in keys]).T # 提取权重数组 weights = np.array([my_dict2[k] for k in keys]) # 计算每行加权和 → 求和所有行结果 → 乘以0.5 result = 0.5 * np.sum(arr @ weights) print(result) # 输出:841.0
核心逻辑:利用矩阵乘法@快速计算每行的加权和,整个流程无需硬编码键名,新增或减少键时代码无需修改。
方法二:Pandas实现(简洁易读)
借助DataFrame的广播特性,实现按列加权求和:
import pandas as pd my_dict1 = {'c1': [10, 11, 12], 'c2': [100, 110, 120], 'c3': [200, 210, 220]} my_dict2 = {'c1': 3, 'c2': 1, 'c3': 2} # 将my_dict1转换为DataFrame,每列对应一个键 df = pd.DataFrame(my_dict1) # 将my_dict2转换为Series作为权重 weights = pd.Series(my_dict2) # 按列加权 → 每行求和 → 所有行求和 → 乘以0.5 result = 0.5 * (df * weights).sum().sum() print(result) # 输出:841.0
核心逻辑:df * weights会自动按列名匹配权重,后续两次sum()分别完成行内求和与全局求和,代码简洁直观,适合需要数据可视化或后续分析的场景。
内容的提问来源于stack exchange,提问作者user19396094
相关产品推荐
相关产品推荐

