Re: Efficient way to merge lists--Programming help

• To: mathgroup at smc.vnet.net
• Subject: [mg12734] Re: [mg12708] Efficient way to merge lists--Programming help
• From: Carl Woll <carlw at fermi.phys.washington.edu>
• Date: Thu, 4 Jun 1998 02:52:18 -0400
• Sender: owner-wri-mathgroup at wolfram.com

```Hi again Joel,

One way to do what you want is as follows. Use the second list to define
a function which changes {x,y,_} to {x,y,newz}, and then apply this
function to the first list. Specifically, define

f[{a_,b_,c_}] := g[{a,b,_}] = {a,b,c} g[a_] := a

Apply the function f to your second list

f /@ test2;

Now g is defined such that if {a,b,_} is an element of test2, g[{a,b,d}]
will return {a,b,c} from test2, otherwise g will return {a,b,d}. This
is exactly what you want, so the next step is to apply g to test1

g /@ test1

which returns the desired list of triples. We can combine the above into
a single function

replace[test1_, test2_] := Module[{f,g},
f[{a_,b_,c_}] := g[{a,b,_}] = {a,b,c};
g[a_] := a;
f /@ test2;
g /@ test1
]

I don't know if this is a better solution, but at least I think it's
easy to understand how it works. If you knew that the triples were
ordered, many other solutions would be possible.

Cheers,

Carl Woll
Dept of Physics
U of Washington

On Wed, 3 Jun 1998, Joel Cannon wrote:

> Cam someone suggest better ways to accomplish the following?
>
> I have two lists containing triplets--test is a rectangular array of
> triplets {x,y,z} (e.g. Dimensions {4,40,3}) and test2 is an array of
> triplets (e.g. Dimensions {50,3}). test2 is to replace equivalent
> elements in test (when the x and y values are equal--the test2 z values
> have been calculated more accurately).
>
> The task can be understood to be:
>
> 1. Given a triplet {x_i,y_i,z_i} from test2, find the position in test
> which has the same {x_i,y_i,_}.
>
> 2. Replace the element in test by the triplet from test2.
>
>
> I resorted to a loop after I decided that it would take me too much time
> to figure out a better, more elegant solution. Here is what I did:
>
> For[i=1,i<=Length[test2],i++,
>   test = ReplacePart[test,test2[[i]],
>      test//Position[#,{test2[[i]][[1]],test2[[i]][[2]],_}]& //Flatten]];
>
> Thanks for any help.
>
> ------------------------------------------------------------------------------
> Joel W. Cannon                 |   (318)869-5160          Dept. of
> Physics               |   (318)869-5026  FAX    Centenary College of
> Louisiana |       P. O. Box 41188		       |
> Shreveport, LA 71134-1188      |
>
>
>
>

```

• Prev by Date: Re: Greek letter epsilon / varepsilon
• Next by Date: RE: Absolute coordinates in Ma
• Previous by thread: Re: Efficient way to merge lists--Programming help
• Next by thread: Re: Efficient way to merge lists--Programming help