Python. Преобразуйте str ('+') в математическую операцию - PullRequest
1 голос
/ 16 октября 2010

Как преобразовать 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 == '+': ... Спасибо.

Ответы [ 7 ]

4 голосов
/ 16 октября 2010

Вы также можете использовать операторский модуль:

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])
2 голосов
/ 16 октября 2010

Если ваши математические выражения будут соответствовать синтаксису Python, но вы не уверены в eval (вы должны быть), вы можете заглянуть в модуль ast Python ( docs ).Он проанализирует выражение в абстрактном синтаксическом дереве, которое вы можете перебрать.Вы можете оценить ограниченное подмножество Python и выдавать ошибки, если вы столкнетесь с чем-то за пределами вашей грамматики выражения.

2 голосов
/ 16 октября 2010

я думаю, вы ищете eval (), но я советую использовать что-то еще ... однако

>>> eval('-1*2')
-2

eval 'выполняет' строку, которую вы ей передаете, как код. так что это довольно опасно для безопасности, особенно если параметры вводятся пользователем ...

в этом случае я предлагаю использовать библиотеку разбора, такую ​​как ply http://www.dabeaz.com/ply/ что для такой вещи действительно просто в использовании и очень эффективно:)

1 голос
/ 16 октября 2010

Вы можете прочитать о http://en.wikipedia.org/wiki/Reverse_Polish_notation

1 голос
/ 16 октября 2010

Используйте eval, как все говорят, но сначала отфильтруйте его.

>>> s = '1 + 12 / 2 - 12*31'
>>> allowed = set(' 1234567890()+-/*\\')
>>> if allowed.issuperset(s):
...     eval(s)
... 
-365
0 голосов
/ 16 октября 2010

Dett,

Простой eval для всей строки ... Однако следует помнить, что если пользователь вводит строку, eval является рискованным, если вы сначала не выполните какой-либо анализ

x = '-1*2'
y = eval(x)

тогда y будет целочисленным значением.

0 голосов
/ 16 октября 2010

Используйте eval:

> eval(str('-1*2'))
> -2
...