L oop над словарем эффективно - PullRequest
1 голос
/ 20 июня 2020

У меня есть словарь формы: {'p0': -1.0, 'p1': -9.73133548174993, 'p2': 0.0306594941614714, 'p3': 2.0, 'p4': 0.514879452523938} (намного длиннее, чем это) и некоторые строки выражений, содержащие p0, p1 ... например, p0*x+p1**2+p3+1. Я хочу заменить каждый экземпляр параметра pi его значением в словаре. Есть ли быстрый способ сделать это (в котором я не использую просто a для l oop и .replace () для строки)? Спасибо!

Ответы [ 5 ]

3 голосов
/ 20 июня 2020

Лучший способ сделать это, вероятно, будет с помощью метода 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
2 голосов
/ 20 июня 2020

Я думаю, вы можете использовать что-то вроде 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)) 
1 голос
/ 20 июня 2020

У вас есть два хороших ответа (пока) с использованием 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)
1 голос
/ 20 июня 2020

Вы можете переписать уравнения для использования словаря

def func(d, x):
    return d['p0']*x+d['p1']**2+d['p3']+1
    

Или вы можете использовать eval, используя dict в качестве пространства имен

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))

Второй метод требует повторного анализа string каждый раз, поэтому может быть немного медленнее, чем первый. Вы можете предварительно скомпилировать выражения или кэшировать их как go. Это немного сложнее и имеет значение, только если вы делаете это много.

_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)
0 голосов
/ 21 июня 2020
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...