Though you solved your issue, you might also want to be aware of the tools 
in core/traversal --  ne of the preorder_traversal or postorder_traversal 
tools allows you to exit after the first occurrance  --  and simplify/epath.

/c

On Friday, August 2, 2024 at 2:48:11 PM UTC-5 [email protected] wrote:

> Thanks, that is useful information. After some more work, I can see that 
> the first occurrence, in this case, has other things that distinguish is 
> from the rest, and it turned out to be easy to filter for that, so my 
> original problem is solved.
>
> On Thursday, August 1, 2024 at 9:52:50 PM UTC+2 [email protected] wrote:
>
>> As far as I know, this functionality isn't implemented anywhere. The 
>> notion of "first one" would be a little ambiguous anyways because it 
>> would depend on the args ordering, which might not be the same as the 
>> printer order. 
>>
>> If you are targeting a specific expression and you know of a larger 
>> expression that you want to be treated differently, you could replace 
>> that exact expression. For example, if you had 
>>
>> expr = sin(a) + cos(a) 
>>
>> and you wanted to replace a in sin(a) but not in cos(a) you could just 
>> use expr.subs(sin(a), sin(x)). 
>>
>> Barring that, you would need to write this substitution algorithm from 
>> scratch by walking the expression tree. 
>>
>> I guess a max_replacements keyword argument could be added to subs or 
>> replace, although this is the first time I've heard of someone needing 
>> it. 
>>
>> Aaron Meurer 
>>
>> On Thu, Aug 1, 2024 at 11:49 AM Thomas Ligon <[email protected]> 
>> wrote: 
>> > 
>> > I want to remove all occurrences of “a” in expression “exp” except for 
>> the first one, which I want to keep. 
>> > 
>> > To do that, I have tried 
>> > X = symbols(‘X’) 
>> > 
>> > <<replace first occurrence of a by X>> 
>> > 
>> > replace all remaining occurrences by 0 
>> > 
>> > replace X by a 
>> > 
>> > For the second statement, an Internet search suggested replace, like 
>> this: 
>> > 
>> > X = symbols(‘X’) 
>> > 
>> > exp = exp.replace(a, X, 1) # maximum of one replacement 
>> > 
>> > exp = exp.subs(a, 0) 
>> > 
>> > exp = exp.subs(X, a) 
>> > 
>> > Unfortunately, this version of replace doesn’t work, and I have not 
>> found any way to do it with subs of xreplace. This post tells me that subs 
>> and replace have kwargs, but I haven’t found any documentation on that. 
>> > 
>> > 
>> https://stackoverflow.com/questions/56584025/sympy-subs-vs-replace-vs-xreplace
>>  
>> > 
>> > -- 
>> > You received this message because you are subscribed to the Google 
>> Groups "sympy" group. 
>> > To unsubscribe from this group and stop receiving emails from it, send 
>> an email to [email protected]. 
>> > To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/sympy/febcad9b-c406-4636-965f-ab9afec8f501n%40googlegroups.com.
>>  
>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/e0dd6490-d2e5-475c-81e3-f100b3aa71ecn%40googlegroups.com.

Reply via email to