web-dev-qa-db-fra.com

Comment puis-je obtenir une liste des symboles dans une expression sympy?

Par exemple, si je lance

import sympy
x, y, z = sympy.symbols('x:z')
f = sympy.exp(x + y) - sympy.sqrt(z)

existe-t-il une méthode de f que je peux utiliser pour obtenir une liste ou un tuple d'objets sympy.Symbol que l'expression contient? Je préfère ne pas avoir à analyser srepr(f) ou à analyser vers le bas via f.args.

Dans ce cas, g.args[0].args[1].args[0] Me donne Symbol("z"), tandis que g.args[1].args[0].args Me donne le Tuple (Symbol("x"), Symbol("y")), Mais évidemment, cela est spécifique à l'expression.

34
Michael A

Vous pouvez utiliser:

f.free_symbols

qui renverra un ensemble de tous les symboles gratuits.

Exemple:

>>> import sympy
>>> x, y, z = sympy.symbols('x:z')
>>> f = sympy.exp(x + y) - sympy.sqrt(z)
>>> f.free_symbols
set([x, z, y])
37

Notez que réponse JuniorCompressors répertorie uniquement les variables libres .

Si vous avez un Sum , un Product , un Integral , ou quelque chose similaire, vous pouvez ou non vouloir connaître en plus la variable d'intégration/sommation en utilisant le .variables attribut:

In [216]: (x, n) = sympy.symbols("x n")

In [217]: f = sympy.Sum(x, (n, 0, 10))

In [218]: f.free_symbols
Out[218]: {x}

In [219]: f.variables
Out[219]: [n]
3
gerrit

Un attribut très utile est atoms

x, y, z = sympy.symbols('x:z')
expr1 = sympy.exp(x + y) - sympy.sqrt(z)
display(expr1.free_symbols)
display(expr1.atoms(sympy.Symbol))

{????,????,????} 
{????,????,????}

En plus des symboles, atoms peut extraire d'autres atomes, par exemple:

display(expr1.atoms(sympy.Function))
display(expr1.atoms(sympy.Number))
display(expr1.atoms(sympy.NumberSymbol))
display(expr1.atoms(sympy.function.AppliedUndef))
display(expr1.atoms(sympy.Mul))
display(expr1.atoms(sympy.Add))

(cela vaut la peine de vérifier la sortie). Concernant le réponse par gerrit

n = sympy.Symbol('n')
k2 = sympy.Sum(x, (n, 0, 10))
display(k2.free_symbols)
display(k2.variables)
display(k2.atoms(sympy.Symbol))

{????} 
[????]
{????,????}