MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Replace non-numeric values in a list

  • To: mathgroup at smc.vnet.net
  • Subject: [mg88767] Re: Replace non-numeric values in a list
  • From: dr DanW <dmaxwarren at gmail.com>
  • Date: Fri, 16 May 2008 05:30:44 -0400 (EDT)
  • References: <g0h825$mtr$1@smc.vnet.net>

> I have a list that contains numeric and non-numeric values
> list = { a, 1, 2, b, 3};
> How can I replace non-numeric values with zeros?

This is the kind of thing the Mathematica does extremely well.  At the
core of Mathematica is a very sophisticated pattern matching engine
around which everything else is built, so you want to take advantage
of that system as often and directly as possible.  Here is one
solution:

ZeroNonNumeric[ (n_)?NumericQ ] := n;
ZeroNonNumeric[ _ ] := 0;

Map[ ZeroNonNumeric, {a, 1, 2, b, 3} ]

Out[1]= {0, 1, 2, 0, 3}

The first version of the function says that any for pattern for which
the predicate NumericQ[] returns False, throw back that pattern.  The
second version says to return 0 for anything else.  Mathematica will
always try the more specific patterns first, then try more general
patterns.

Finally, I Map that function over the list.  Why do I use Map instead
of ZeroNonNumeric[ {a, 1, 2, b, 3} ] ?  Simple: the list itself is not
a number.  By Map'ping, I make sure that only the elements of the list
get checked, not the list itself.

There are more code-efficient ways of solving this, which all look
like perl code having a bad hair day.  This solution spells out
exactly its intent, which is good practice in any language.


  • Prev by Date: Re: Replace non-numeric values in a list
  • Next by Date: Re: Applying the Integration Function to a List Of Regions
  • Previous by thread: Re: Replace non-numeric values in a list
  • Next by thread: Re: Replace non-numeric values in a list