2015-05-03 8 views
18

Na przykład, jeśli biegnęJak mogę uzyskać listę symboli w wyrażeniu sympy?

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

jest jakaś metoda f że mogę użyć, aby uzyskać listę lub krotka sympy.Symbol obiektach że wyrażenie zawiera? Wolałbym nie parsować srepr(f) lub parsować w dół przez f.args.

W tym przypadku g.args[0].args[1].args[0] daje mi Symbol("z"), natomiast g.args[1].args[0].args daje mi krotki (Symbol("x"), Symbol("y")), ale oczywiście są to wyrażenie specyficzne.

Odpowiedz

21

Można użyć:

f.free_symbols 

który zwróci zbiór wszystkich wolnych symboli.

Przykład:

>>> 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

Zauważ, że to tylko powroty ** darmowe ** symbole. Na przykład dla 'Sum (T, (n, 1, N))/N' zwraca' {N, T} ', ale nie' n'. – gerrit

1

Zauważ, że JuniorCompressors answer tylko wymienia zmienne wolne.

Jeśli masz Sum, a Product, to Integral, lub coś podobnego, może lub może nie chcą dodatkowo wiedzieć zmienną integracji/sumowania za pomocą atrybutu .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

Należy zauważyć, że atrybut 'variables' jest dostępny tylko dla tych konkretnych typów wyrażeń. Na przykład nie działa to: 'f = sympy.Sum (x, (n, 0, 10)) * 2' ponieważ teraz' f' jest typu 'Mul', który nie ma atrybutu. – kazemakase