Re: Function to detect presence of a variable in
- To: mathgroup at smc.vnet.net
- Subject: [mg109411] Re: Function to detect presence of a variable in
- From: Bob Hanlon <hanlonr at cox.net>
- Date: Sun, 25 Apr 2010 06:26:53 -0400 (EDT)
Count[(1/x)^x, x, -1] 2 Count[(2/x)^(x*w^4*z), x, -1] 3 This gives an enexpected result because Count is operating on the FullForm in which x appears 3 times (2/x)^(x*w^4*z) // FullForm Times[Power[2,Times[Power[w,4],x,z]],Power[Power[x,-1],Times[Power[w,4],x,z]]] You can freeze the form with Unevaluated Count[Unevaluated[(2/x)^(x*w^4*z)], x, -1] 2 ClearAll[countMeIn]; SetAttributes[countMeIn, {HoldFirst, Listable}]; countMeIn[expr_, var_] := Count[Unevaluated[expr], var, -1] countMeIn[(2/x)^(x*w^4*z), x] 2 countMeIn[(2/x)^(x*w^4*z), {x, y, w, z}] {2,0,1,1} Bob Hanlon ---- carlos at colorado.edu wrote: ============= I would like to have a function k = CountMeIn[expr,var] that returns the number of times var appears in expr, eg. CountMeIn[(1/x)^x,x] returns 2. var could be a list, in which case k would be a conforming list: k = CountMeIn[(2/x)^(x*w^4*z),{x,y,w,z}] should return {2,0,1,1}. expr is never a list. Tried to use Position for this, but the behavior is finicky: Position[1/x,x] returns {{1,1}} but Position[x,x] or Position[1*x,x] returns {{}} (why?) May be expr should be converted to {expr} inside the function for safety?