Python预定义条件字典并打印条件表达式的实现方案咨询
解决方案
方法一:用字符串存储条件表达式(简单直接)
你可以将条件以字符串形式预先定义,在函数内部通过eval()执行计算,同时直接用字符串作为表达式展示,无需维护两份字典:
import numpy as np # 提前定义条件表达式字典(数组声明之前) input_conditions = { 1: "(a > b) & (b < c)", 2: "(a > b) & (b > c)", 3: "(a > b) & (b == c)" } def myfunc(conds): a = np.array([1,2,3,4,5]) b = np.array([1,1,1,1,1]) c = np.array([5,4,3,2,1]) for k, expr_str in conds.items(): # 执行条件计算 condition_result = eval(expr_str) # 打印表达式和统计结果 print(f'{k}.) {expr_str}: {np.sum(condition_result)}') myfunc(input_conditions)
运行后输出完全符合预期:
1.) (a > b) & (b < c): 3 2.) (a > b) & (b > c): 0 3.) (a > b) & (b == c): 1
为什么这个方案可行?
- 延迟计算:条件以字符串形式存储,不会在定义时立即执行,避免了提前引用未定义变量的问题,直到函数内部有了
a/b/c后才通过eval()执行。 - 表达式复用:直接用存储的字符串作为显示内容,不需要手动维护单独的描述字典,避免了重复劳动和不一致的风险。
注意事项
eval()会执行传入的字符串代码,仅在你完全信任条件来源时使用(这里是你自己定义的条件,完全安全)。如果需要处理不可信输入,建议用更安全的方式(比如AST解析)。
方法二:用自定义类封装条件(更优雅,避免eval)
如果你不想用eval(),可以自定义一个类来封装条件的表达式字符串和计算逻辑:
import numpy as np class Condition: def __init__(self, expr_str): self.expr_str = expr_str # 把表达式转换成可调用的函数 self.func = eval(f"lambda a,b,c: {expr_str}") def __call__(self, a, b, c): return self.func(a, b, c) # 提前定义条件字典 input_conditions = { 1: Condition("(a > b) & (b < c)"), 2: Condition("(a > b) & (b > c)"), 3: Condition("(a > b) & (b == c)") } def myfunc(conds): a = np.array([1,2,3,4,5]) b = np.array([1,1,1,1,1]) c = np.array([5,4,3,2,1]) for k, cond in conds.items(): result = cond(a, b, c) print(f'{k}.) {cond.expr_str}: {np.sum(result)}') myfunc(input_conditions)
这个方案把条件封装成对象,既保留了表达式字符串,又封装了计算逻辑,比直接用eval()更结构化,同样满足你的需求。
内容的提问来源于stack exchange,提问作者TioLiba
相关产品推荐
相关产品推荐

