MathGroup Archive 1998

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

Search the Archive

Re: Request for help: working with multi-level lists


KCConnolly wrote:

> I have a list of 10 elements, each of which is a list of three elements
> (let's say in each case an integer, a real number, and a string). I am
> looking for the most elegant way to select those first-level elements
> (i.e., the lists) whose integer element is equal to a particular value
> (let's say "1"), and then to obtain the mean of the real number
> elements of the lists selected.

For a moderately elegant solution, you could use a simple recursive
algorithm as the following:
Assuming that your inner list has the following structure: {integer,
float, string}

-Is the list empty?
    Yes- return Sum/(N of elements) //The base case
    No- continue
-Is integer == key?
    Yes- sum=sum+float, N=N+1, and recurse with the rest of the list
    No- Restart with the rest of the list.

this algorithm will go through the list only once and return the mean as
demanded.
Now for a quick Mathematica code:

Helper[lst_,key_,s_,n_]:=
    If[lst=={}
        ,s/n
        ,If[First[First[lst]]==key
            ,Helper[Rest[lst],key,(s+First[Rest[First[lst]]]),(n+1)]
            ,Helper[Rest[lst],key,s,n]
        ]
    ];
keyMean[lst_,key_]:=Helper[lst,key,0,0]

The last line is just the frontend of the small engine. You can just
call the function as
keyMean[ <list>, <key>]
e.g.:
keyMean[{{1,2.0,"sdafg"},{4,5.3,"sdfg"},{2,34.4,"fdg"},{1,3.8,"dfg"},{7,4.56,
"sgh"}},1]

Note that you can also use MemberQ instead of the long "First[Rest[.."
thing, but if some of your data happen to look like your key, you might
run into problems.
Hope that helps.
:-Denis



  • Prev by Date: Re: High precision numbers and Plot[] ?
  • Next by Date: Re: Request for help: working with multi-level lists
  • Previous by thread: Re: Request for help: working with multi-level lists
  • Next by thread: Re: Request for help: working with multi-level lists