Как извлечь из списка цифры и мат. оператор и совершить математическое действие?

Я совсем недавно начал изучать Python и столкнулся вот с такой задачей: дан список из математических операторов и цифр

['//', '456732', '432', '*', '6847', '13', '+', '2345', '9876'] (ну там дальше много...)

необходимо совершить над ними мат. действия(первый элемент) и получить в итоге файл:

1057 89011 12221 и т.д.

Подскажите как к этому подступиться, а то я голову себе сломал, не понимаю - как???


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

Автор решения: denisnumb

Самый простой вариант - написать функцию которая просматривала бы каждый элемент списка и при попадании на оператор, считывала бы следующие 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
→ Ссылка