p
u
b
l
i
c
i
t
é
publicité

Discussion: Arbre de calcul

  1. #1
    Nouveau Membre du Club
    Inscrit en
    avril 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 75
    Points : 28
    Points
    28

    Par défaut Arbre de calcul

    Bonjour, je voudrais créer une fonction qui parse une expression mathématique (un problème classique pour lequel je n'ai pas trouvé de solution en python). Le but serait quelque chose du genre :

    analyse('2*x+(3+x)') renverrai une liste : ['+','2*x','3+x']

    J'arrive à parser l'expression en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    import ast
    st = ast.parse("2*x+(3+x)").body[0]
    print st.value
    print st.value.left
    print st.value.right
    Le problème est que je n'ai pas trouvé l'instruction pour recréer le membre de gauche et de droite. Avez-vous une solution ?

    Merci d'avance,
    Vincent

    P.S : Je ne veux pas utiliser sympy car il effectue des simplifications au moment de la conversion.

  2. #2
    Expert Confirmé Sénior
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 670
    Points : 4 957
    Points
    4 957
    Billets dans le blog
    6

    Par défaut

    Bonjour,

    Peut-être voir du côté de pyparsing: http://pyparsing.wikispaces.com/

    Je ne le connais pas, mais il y a un exemple ici: http://pyparsing.wikispaces.com/file/view/fourFn.py

    Avec lui, on peut obtenir par exemple:

    '(2+3)/5^2' => ['2', '3', '+', '5', '2', '^', '/']

    C'est de la polonaise inverse, mais on peut peut-être obtenir l'arbre que tu cherches en modifiant sa configuration?


    [Edit] Sinon, avec ast:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    y = ast.parse('2*x+(3+x)', "", "eval")
     
    print ast.dump(y)
    #Expression(body=BinOp(left=BinOp(left=Num(n=2), op=Mult(), right=Name(id='x', ctx=Load())), op=Add(), right=BinOp(left=Num(n=3), op=Add(), right=Name(id='x', ctx=Load()))))
    print "=>", y.body.left, isinstance(y.body.left, ast.BinOp)
    #=> <_ast.BinOp object at 0x021A83D0> True
    print "=>", y.body.op, isinstance(y.body.op, ast.Add)
    #=> <_ast.Add object at 0x021A3350> True
    print "=>", y.body.right, isinstance(y.body.left, ast.BinOp)
    #=> <_ast.BinOp object at 0x021A8430> True
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Nouveau Membre du Club
    Inscrit en
    avril 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 75
    Points : 28
    Points
    28

    Par défaut

    Bonjour,

    J'ai finalement recréé l'expression à la main via une petite fonction récursive, je pensais qu'elle existait déjà.

    Merci pour la réponse,
    Vincent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C] Calcul arbre de possibilité puissance 4
    Par bglacial dans le forum Intelligence artificielle
    Réponses: 2
    Dernier message: 23/11/2011, 22h09
  2. Arbre de calcul et sympy
    Par magicvinni dans le forum EDI/RAD
    Réponses: 1
    Dernier message: 28/08/2011, 18h34
  3. Calculer le niveau d'un arbre
    Par alex2746 dans le forum Général Java
    Réponses: 1
    Dernier message: 23/08/2011, 12h06
  4. Calcul d'un arbre n-aires , debutant
    Par Freedom57 dans le forum Caml
    Réponses: 8
    Dernier message: 05/02/2011, 18h19
  5. [conception] arbre de calculs
    Par Jidévé dans le forum Modélisation
    Réponses: 7
    Dernier message: 10/10/2005, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo