Как извлечь из списка цифры и мат. оператор и совершить математическое действие?
Я совсем недавно начал изучать Python и столкнулся вот с такой задачей: дан список из математических операторов и цифр
['//', '456732', '432', '*', '6847', '13', '+', '2345', '9876'] (ну там дальше много...)
необходимо совершить над ними мат. действия(первый элемент) и получить в итоге файл:
1057 89011 12221 и т.д.
Подскажите как к этому подступиться, а то я голову себе сломал, не понимаю - как???
Ответы (1 шт):
Самый простой вариант - написать функцию которая просматривала бы каждый элемент списка и при попадании на оператор, считывала бы следующие 2 числа, а затем считала результат. Но это прямое решение "в лоб". Есть, чуть более сложное, но компактное решение через функцию zip()
Создадим итератор вашего списка с операторами и числами (назовем его data).
data = iter(['//', '456732', '432', '*', '6847', '13', '+', '2345', '9876'])
Теперь поместим 3 копии data в функцию zip(), которая позволит работать сразу с тремя переменными в цикле for. Важно указать переменные цикла именно в том порядке, в котором они идут в списке, т.е. сначала оператор, а потом два числа a и b.
for operator, a, b in zip(data, data, data):
print(a, operator, b)
Ну и самая большая часть кода - это функция математической операции с участием оператора и 2 чисел. Ее можно написать прямо в лоб, через if:
def parse_math_operation(a: int, operator: str, b: int):
if operator == '+':
return a + b
if operator == '-':
return a - b
if operator == '*':
return a * b
if operator == '/':
return a / b
return a // b
Полный код: (как записать результат в файл, думаю, знаете)
def parse_math_operation(a: int, operator: str, b: int):
if operator == '+': return a + b
if operator == '-': return a - b
if operator == '*': return a * b
if operator == '/': return a / b
# еще какие-то операторы
# . . .
# для последнего оператора не нужна ветка if/elif/else
# так как при всех предыдущих условиях функция прерывается, возвращая значение
return a // b
data = iter(['//', '456732', '432', '*', '6847', '13', '+', '2345', '9876'])
for operator, a, b in zip(data, data, data):
# # работаем с числами
# # поэтому строки нужно преобразовать
print(a, operator, b, '=', parse_math_operation(int(a), operator, int(b)))
Выхлоп:
456732 // 432 = 1057
6847 * 13 = 89011
2345 + 9876 = 12221