如何无循环计算表中Formula列表达式并更新Total列?
原始表格
| Product | Formula | Total |
|---|---|---|
| FA1 | NULL | 50 |
| FA2 | NULL | 60 |
| FA | FA1+FA2 | |
| CA1 | NULL | 40 |
| CA2 | NULL | 30 |
| CA | CA1-CA2 |
预期计算结果
| Product | Formula | Total |
|---|---|---|
| FA1 | NULL | 50 |
| FA2 | NULL | 60 |
| FA | FA1+FA2 | 110 (FA1+FA2) |
| CA1 | NULL | 40 |
| CA2 | NULL | 30 |
| CA | CA1-CA2 | 10 (CA1-CA2) |
完全可以不用显式循环实现这个计算,核心逻辑是先建立已知产品的数值映射,再直接解析表达式完成计算:
实现思路
- 提取所有
Formula为NULL的产品,将其名称和对应Total值存入一个映射字典,比如{'FA1':50, 'FA2':60, 'CA1':40, 'CA2':30}。 - 针对
Formula非空的行,把公式里的产品名称替换成映射字典中的对应数值,计算表达式结果。 - 将计算结果与原公式拼接,更新
Total列内容。
示例代码(Python)
用列表推导式替代显式循环,代码更简洁:
# 原始表格数据 table_data = [ {'Product': 'FA1', 'Formula': None, 'Total': 50}, {'Product': 'FA2', 'Formula': None, 'Total': 60}, {'Product': 'FA', 'Formula': 'FA1+FA2', 'Total': ''}, {'Product': 'CA1', 'Formula': None, 'Total': 40}, {'Product': 'CA2', 'Formula': None, 'Total': 30}, {'Product': 'CA', 'Formula': 'CA1-CA2', 'Total': ''} ] # 建立已知数值的映射字典 value_map = {item['Product']: item['Total'] for item in table_data if item['Formula'] is None} # 批量更新计算行,无显式循环 updated_data = [ {**item, 'Total': f"{eval(item['Formula'], value_map)} ({item['Formula']})"} if item['Formula'] is not None else item for item in table_data ] # 输出Markdown格式结果 print("| Product | Formula | Total |") print("|---------|---------|-------|") for row in updated_data: print(f"| {row['Product']} | {row['Formula'] if row['Formula'] else 'NULL'} | {row['Total']} |")
安全优化提示
如果公式来源不可信,不要用eval,可以用Python的ast模块解析表达式,避免执行恶意代码:
import ast def safe_eval(expr, value_map): tree = ast.parse(expr, mode='eval') # 只允许变量和加减运算 for node in ast.walk(tree): if not isinstance(node, (ast.Name, ast.Add, ast.Sub, ast.Constant)): raise ValueError("不支持的表达式类型") return eval(compile(tree, '', 'eval'), value_map)
内容的提问来源于stack exchange,提问作者James Acereoin
相关产品推荐
相关产品推荐

