Как преобразовать str ('+') в математическую операцию?Например:
a = [0,1,2] # or a = ['0','1','2'] b = ['+','-','*'] c = int(a[0]+b[0]+a[1])
Другими словами, как преобразовать str('-1*2') в int(), без for i in c: if i == '+': ... Спасибо.
str('-1*2')
int()
for i in c: if i == '+': ...
Вы также можете использовать операторский модуль:
import operator as op #Create a mapping between the string and the operator: ops = {'+': op.add, '-': op.sub, '*': op.mul} a = [0,1,2] b = ['+','-','*'] #use the mapping c = ops[b[0]](a[0], a[1])
Если ваши математические выражения будут соответствовать синтаксису Python, но вы не уверены в eval (вы должны быть), вы можете заглянуть в модуль ast Python ( docs ).Он проанализирует выражение в абстрактном синтаксическом дереве, которое вы можете перебрать.Вы можете оценить ограниченное подмножество Python и выдавать ошибки, если вы столкнетесь с чем-то за пределами вашей грамматики выражения.
ast
я думаю, вы ищете eval (), но я советую использовать что-то еще ... однако
>>> eval('-1*2') -2
eval 'выполняет' строку, которую вы ей передаете, как код. так что это довольно опасно для безопасности, особенно если параметры вводятся пользователем ...
в этом случае я предлагаю использовать библиотеку разбора, такую как ply http://www.dabeaz.com/ply/ что для такой вещи действительно просто в использовании и очень эффективно:)
Вы можете прочитать о http://en.wikipedia.org/wiki/Reverse_Polish_notation
Используйте eval, как все говорят, но сначала отфильтруйте его.
>>> s = '1 + 12 / 2 - 12*31' >>> allowed = set(' 1234567890()+-/*\\') >>> if allowed.issuperset(s): ... eval(s) ... -365
Dett,
Простой eval для всей строки ... Однако следует помнить, что если пользователь вводит строку, eval является рискованным, если вы сначала не выполните какой-либо анализ
x = '-1*2' y = eval(x)
тогда y будет целочисленным значением.
Используйте eval:
> eval(str('-1*2')) > -2