2015-05-03 8 views
18

Per esempio, se corroCome posso ottenere un elenco dei simboli in un'espressione sympy?

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

Esiste un metodo di f che posso usare per ottenere una lista o tupla di sympy.Symbol oggetti che l'espressione contiene? Preferirei non dover analizzare srepr(f) o analizzare verso il basso tramite f.args.

In questo caso, g.args[0].args[1].args[0] mi dà Symbol("z"), mentre g.args[1].args[0].args mi dà la tupla (Symbol("x"), Symbol("y")), ma ovviamente questi sono specifici per l'espressione.

risposta

21

È possibile utilizzare:

f.free_symbols 

che restituirà un insieme di tutti i simboli liberi.

Esempio:

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

Si noti che questo solo restituisce ** simboli ** gratuiti. Ad esempio, per 'Sum (T, (n, 1, N))/N' restituisce' {N, T} ', ma non' n'. – gerrit

1

Nota che JuniorCompressors answer elenca solo variabili libere.

Se si dispone di un Sum, un Product, un Integral, o qualcosa di simile, si può o non vogliono sapere in aggiunta la variabile di integrazione/sommatoria utilizzando l'attributo .variables:

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] 
+2

Si noti che l'attributo 'variables' è disponibile solo per questi tipi di espressioni concrete. Ad esempio, questo fallisce: 'f = sympy.Sum (x, (n, 0, 10)) * 2' perché ora' f' è di tipo 'Mul', che non ha l'attributo. – kazemakase

Problemi correlati