我有一个形式为{'p0': -1.0, 'p1': -9.73133548174993, 'p2': 0.0306594941614714, 'p3': 2.0, 'p4': 0.514879452523938}
的字典(比这更长),还有一些包含p0,p1 ...的表达式字符串,例如p0*x+p1**2+p3+1
。我想用字典中的值替换参数pi
的每个实例。有没有一种快速的方法(在其中我不只是使用for循环和.replace()作为字符串)?谢谢!
答案 0 :(得分:3)
执行此操作的最佳方法可能是使用str.format_map()
方法,尽管这将需要将替换后的元素括在大括号中,因此,如果您无法确保输入数据具有那,您将不得不单独替换它。
>>> in_str = '{p0}*x+{p1}**2+{p3}+1'
>>> vals = {'p0': -1.0, 'p1': -9.73133548174993, 'p2': 0.0306594941614714, 'p3': 2.0, 'p4': 0.514879452523938}
>>> in_str.format_map(vals)
-1.0*x+-9.73133548174993**2+2.0+1
答案 1 :(得分:2)
我认为您可以使用类似format_map()的方法来执行此操作?如果我理解正确
# input stored in variable a.
a = {'x':'John', 'y':'Wick'}
# Use of format_map() function
print("{x}'s last name is {y}".format_map(a))
答案 2 :(得分:1)
您可以重写等式以使用字典
def func(d, x):
return d['p0']*x+d['p1']**2+d['p3']+1
或者您可以将dict作为命名空间使用eval
def p_func_eval(data, x):
return eval('p0*x+p1**2+p3+1', None, data)
data = {'p0': -1.0, 'p1': -9.73133548174993, 'p2': 0.0306594941614714, 'p3': 2.0, 'p4': 0.514879452523938}
print(func(data, 33))
第二种方法每次都需要重新解析字符串,因此它可能比第一种慢一些。您可以预编译表达式,也可以随时缓存它们。这有点复杂,并且只有在大量使用时才会有所作为。
_p_func_cache = {}
def p_fun_eval(expression, data, x):
if expression not in _p_func_cache:
_p_func_cache[expression] = compile(expression, 'p_func', 'eval')
return eval(_p_func_cache[expression], None, data)
答案 3 :(得分:1)
到目前为止,您在这里使用format_map有两个很好的答案。现在,您只需要一个正则表达式即可将所有p#或p ##或p ###值替换为周围的{}(如其答案中的{p#}):
import re
formula = "p0*x+p1**2+p33+1"
new_formula = re.sub(r"(p\d*)",r"{\1}",formula)
print (new_formula)
答案 4 :(得分:0)
d={'p0': -1.0, 'p1': -9.73133548174993, 'p2': 0.0306594941614714, 'p3': 2.0, 'p4': 0.514879452523938}
for k,v in d.items():
locals()[k]=v # or vars()[k]=v or globals()[k]=v
#each keys in d is converted into variables whose values is corresponding d.values()
print(p0,p1,p2,p3,p4)
答案 5 :(得分:0)
equation="p0*x+p1**2+p3+1"
mydict={'p0': -1.0, 'p1': -9.73133548174993, 'p2': 0.0306594941614714, 'p3': 2.0,
'p4': 0.514879452523938}
for k,v in mydict.items():
equation=re.sub(str(k),str(v),equation)
print(equation)
输出:
-1.0*x+-9.73133548174993**2+2.0+1