有效地循环字典

时间:2020-06-20 19:39:37

标签: python string dictionary

我有一个形式为{'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()作为字符串)?谢谢!

6 个答案:

答案 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