如何对嵌套字典内不同二级键的对应位置数值做乘加运算且支持扩展
通用可扩展实现方案
核心思路是自动识别所有一级Axis键,不需要硬编码指定,支持任意数量Axis、任意自定义运算逻辑:
from typing import Dict, Callable def axis_calculate(row: Dict, calculate_func: Callable, round_digit: int = None) -> Dict: """ 多Axis对应位置数值通用运算 :param row: 输入的嵌套字典 :param calculate_func: 运算函数,入参数量和Axis数量一致 :param round_digit: 结果保留小数位数,可选 :return: 运算后的结果字典 """ # 自动提取所有Axis的子字典,新增Axis无需修改代码 all_axis = list(row.values()) # 取第一个Axis的键作为输出结果的一级键、子键列表 output_main_key = list(row.keys())[0] output_sub_keys = list(all_axis[0].keys()) # 按位置打包所有Axis的数值 position_values = zip(*[list(axis_dict.values()) for axis_dict in all_axis]) # 执行自定义运算 result_values = [] for vals in position_values: res = calculate_func(*vals) if round_digit is not None: res = round(res, round_digit) result_values.append(res) # 拼接返回结果 return { output_main_key: dict(zip(output_sub_keys, result_values)) }
使用示例
1. 乘法场景(匹配需求)
row1 = {'XAxis': {'X1': 0.2, 'X2': 0, 'X3': 0.75}, 'YAxis': {'1A': 0.1, '2B': 0.2, '3C': 0.45}} # 传入乘法逻辑,保留2位小数 multiply_res = axis_calculate(row1, lambda x, y: x*y, round_digit=2) print(multiply_res) # 输出:{'XAxis': {'X1': 0.02, 'X2': 0.0, 'X3': 0.34}}
2. 加法场景
# 传入加法逻辑 sum_res = axis_calculate(row1, lambda x, y: x+y, round_digit=2) print(sum_res) # 输出:{'XAxis': {'X1': 0.3, 'X2': 0.2, 'X3': 1.2}}
3. 多Axis扩展场景
新增ZAxis时不需要修改函数代码,直接调整运算函数入参即可:
row2 = { 'XAxis': {'X1': 0.2, 'X2': 0, 'X3': 0.75}, 'YAxis': {'1A': 0.1, '2B': 0.2, '3C': 0.45}, 'ZAxis': {'A1': 0.5, 'B2': 0.3, 'C3': 0.2} } # 三个Axis数值相乘 triple_res = axis_calculate(row2, lambda x, y, z: x*y*z, round_digit=3) print(triple_res) # 输出:{'XAxis': {'X1': 0.01, 'X2': 0.0, 'X3': 0.068}}
注意事项
- 如果Axis的子字典插入顺序不确定,可将取值逻辑修改为按键排序后取值,保证位置对应准确:将
list(axis_dict.values())替换为[v for k, v in sorted(axis_dict.items())] - 支持任意自定义运算,只要传入对应逻辑的
calculate_func即可,比如求平均、求最大值等都可以直接适配
内容的提问来源于stack exchange,提问作者ObamaVEVO
相关产品推荐
相关产品推荐

