Преобразование списка в арифметическое выражение

я новичек, возникла проблема, уже весь мозг сломался.

На входе у меня есть список: ['3', '+', '0.34', '-', '3', '*', '0.051651', '/', '7', '+', '1.201E+3']

На выходне мне нужно получить запись следующего вида, чтобы она рассчиталась: x = Decimal('3') + Decimal('0.34') - Decimal ('3') * Decimal('0.051651') / Decimal('7') + Decimal('1.201E+3')

Ожидается, что если напишу Print(x) вернется результат арифметических действий

Помогите, пожалуйста, не понимаю как отформатировать список в арифметическое выражение. Спасибо заранее


Ответы (2 шт):

Автор решения: ПИТОНИСТ версия-3-8

Попробуйте так:

a=['3', '+', '0.34', '-', '3', '*', '0.051651', '/', '7', '+', '1.201E+3']
b='print('
for i in a:
    b+=i
b+=')'
exec(b)

Все значения списка a перебираются и добавляются в строку b. Ваше выражение хранится в переменной b, функция exec может выполнять функцию из строки, в данном случае из строки b.

→ Ссылка
Автор решения: Петр Иванов

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

#строка с любыми арифметическими действиями
b = '65465.046546*65465-35184'

#с помощью регулярный выражений разбивка
d2 = re.split(r'((?:[+-]?\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?)',b)
#избавляюсь от пустот
d3 = list(filter(None, d2))

summarizer = Decimal('0')

for i in d3:
print('начало цикла')
if '*' in d3:
    superindex = d3.index('*')
    left = d3[(superindex - 1)]
    right = d3[(superindex + 1)]
    result = Decimal(left) * Decimal(right)
    del d3[superindex]
    del d3[superindex]
    d3[(superindex - 1)] = str(result)

elif '/' in d3:
    superindex = d3.index('/')
    left = d3[(superindex - 1)]
    right = d3[(superindex + 1)]
    result = Decimal(left) / Decimal(right)
    del d3[superindex]
    del d3[superindex]
    d3[(superindex - 1)] = str(result)

 for j in d3:
  summarizer += Decimal(j)

  print('summarizer',summarizer)

PS Извиняюсь за неубранность в коде, но главное суть.

→ Ссылка