2
votes

Comment calculer un problème mathématique à partir d'une liste en python?

J'ai une liste en python qui ressemble à ceci:

anwser = 5 - 4 * 8

Je voudrais calculer le problème mathématique dans la liste donc:

list = [5, "-", 4, "*", 8]


3 commentaires

Double possible de Évaluer les équations mathématiques à partir d'une entrée utilisateur non sécurisée dans Python


N'utilisez PAS eval () pour cela - il est dangereux et sujet aux erreurs.


Analysez-le dans un arbre d'expression. Parcourez l'arbre et évaluez. La réponse pourrait également être 8, selon la manière de mettre en œuvre les règles de priorité.


3 Réponses :


1
votes

Cela fonctionnera:

eval(''.join([str(x) for x in list]))

Mais soyez prudent en utilisant eval !


0 commentaires

2
votes

C'est ce que vous appelez une notation Infix ( https://en.wikipedia.org/wiki/ Infix_notation )

Vous pouvez utiliser une pile pour l'évaluer. J'ai trouvé ici l'essentiel qui pourrait aider ( https: //gist.github .com / nava45 / 6333409 # file-infix-expression-evaluation )


0 commentaires

2
votes

L'évaluation d'une équation avec la priorité des opérations nécessite un analyseur.

Heureusement, l'écriture d'un analyseur pour l'arithmétique de base, c'est-à-dire l'addition et la multiplication, peut être réalisée assez simplement sans l'utilisation d'outils d'analyse.

Code

-27

Exemple

equation_list = [5, "-", 4, "*", 8]
print(parse(equation_list))

Sortie

import operator

ops = {
    '-': operator.sub,
    '+': operator.add,
    '*': operator.mul,
    '/': operator.truediv
}

def parse_mult(equation):
    equation = iter(equation)
    value = next(equation)
    for token in equation:
        if token == '*' or token == '/':
            op = ops[token]
            value = op(value, next(equation))
        else:
            yield value
            yield token
            value = next(equation)
    yield value

def parse(equation):
    equation = parse_mult(equation)
    value = next(equation)
    for token in equation:
        op = ops[token]
        value = op(value, next(equation))
    return value

Si vous devez jamais analyser des équations avec plus de deux niveaux de priorité, alors qu’un outil d’analyse externe peut devenir nécessaire.


0 commentaires