Re: Extracting information from lists
- To: mathgroup at smc.vnet.net
- Subject: [mg63357] Re: Extracting information from lists
- From: "Jean-Marc Gulliet" <jeanmarc.gulliet at gmail.com>
- Date: Sun, 25 Dec 2005 02:19:35 -0500 (EST)
- Organization: The Open University, Milton Keynes, U.K.
- References: <dojefh$fmb$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
"Tony King" <mathstutoring at ntlworld.com> a écrit dans le message de news:
dojefh$fmb$1 at smc.vnet.net...
| Does anyone know of a function that will allow me to extract the positions
| of the first elements of runs of similar elements within a list. For
| example, suppose that
|
| list={7,9,1,6,8,1,1,6,5,1,1,1,8,7,6,1,1,1,1,7}
|
| I need a function that will return
|
| {3,6,10,16}
|
| corresponding to the runs {1},{1,1},{1,1,1},{1,1,1,1} within list
|
| Many thanks
|
| Tony
|
Hi Tony,
The following set of functions will do what you want:
In[1]:=
searchRuns[lst_List] := Module[{data = lst, flag = False}, (Flatten[#1, 2]
& )[
Rest[Reap[For[cnt = 1, cnt < Length[data], cnt++, If[data[[cnt]] ==
data[[cnt + 1]],
If[flag == False, Sow[{data[[cnt]], cnt}]; flag = True], flag =
False]]]]]]
In[2]:=
searchNoRuns[lst_List] := Module[{data = lst, flag = False},
(Flatten[#1, 2] & )[Rest[Reap[For[cnt = 1, cnt < Length[data], cnt++,
If[data[[cnt]] == data[[cnt + 1]],
flag = True, If[flag == False, Sow[{data[[cnt]], cnt}], flag =
False]]]]]]]
In[3]:=
findRuns[lst_List] := Module[{data = lst, ru, noru, st}, ru =
searchRuns[data]; noru = searchNoRuns[data];
st = Union[First[Transpose[ru]]]; Union[ru, Cases[noru,
{(x_)?(Intersection[{#1}, st] != {} & ), y_}]]]
In[4]:=
findRuns[{7, 9, 1, 6, 8, 1, 1, 6, 5, 1, 1, 1, 8, 7, 6, 1, 1, 1, 1,
7}][[All,2]]
Out[4]= {3, 6, 10, 16}
In[5]:=
data = {7, 9, Pi, {E, I}, {E, I}, 1, 6, 6, 6, 8, Pi, a, a, 1, 1, 6, c, 5,
"word", 1, 1, 1, 8, "word", "word",
7, 6, 1, 1, 1, 1, 7, 2.7`20., 2.7, 2.7, 3, 3};
In[6]:=
findRuns[data]
Out[6]=
{{1, 20}, {1, 28}, {2.7`20., 33}, {3, 36}, {6, 7}, {6, 27}, {"word", 19},
{"word", 24}, {a, 12}, {{E, I}, 4}}
Best regards,
/J.M.