Re: Transforming/expanding a list
- To: mathgroup at smc.vnet.net
- Subject: [mg127997] Re: Transforming/expanding a list
- From: Andrzej Kozlowski <akozlowski at gmail.com>
- Date: Sat, 8 Sep 2012 03:06:48 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <20120906081415.0241D684C@smc.vnet.net>
On 6 Sep 2012, at 10:14, Mark Coleman <markspcoleman at gmail.com> wrote: > I'm working on some Mathematica code that will help transform a large set of lists drawn from my company's legacy database systems. A typical row of the raw data looks like > > {x1,NULL,NULL,x2,NULL,NULL,NULL,NULL,x3,NULL,NULL,x4,x5,NULL} ... > > The lists are sequences of real numbers, separating some some number of Strings which for convenicence sake we call "NULL" (as opposed to a proper Mathematica Null). The goal is to create a new list where each NULL is replaced by the real number that most recently proceeds it (note that any number of NULLs may occur before or after any real values). I would like the code to return > > {x1,x1,x1,x2,x2,x2,x2,x2,x3,x3,x3,x4,x5,x5} > > > Thanks > > Mark > How about something like this: h[ls_] := Module[{u, g}, g[l_] /; VectorQ[l, NumberQ] := (u = Last[l];); g[l_] /; Last[l] == NULL := l /. NULL -> u; DeleteCases[Flatten[Map[g, Split[ls]]], Null]] for example: ls = {1, NULL, NULL, 2, NULL, NULL, NULL, NULL, 3, NULL, NULL, 4, 5, NULL} h[ls] {1,1,2,2,2,2,3,3,5} The way the code is written, it is essential that your x's are numbers, although one could easily change it to make it work with symbols. Andrzej Kozlowski
- References:
- Transforming/expanding a list
- From: Mark Coleman <markspcoleman@gmail.com>
- Transforming/expanding a list