Re: Extracting information from lists
- To: mathgroup at smc.vnet.net
- Subject: [mg63367] Re: Extracting information from lists
- From: rudy <rud-x at caramail.com>
- Date: Tue, 27 Dec 2005 04:42:38 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Hello, li = {7, 9, 1, 6, 8, 1, 1, 6, 5, 1, 1, 1, 8, 7, 6, 1, 1, 1, 1, 7}; lolo = {0, 2, 1, 1, 0, 1, 1, 0, 0, 2, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0}; lulu = {a, b, d, d, d, d, c, f, g, t, d, d, e, r, d, d, d, e, r, d, d, e, f, r,f}; Here are three function with different degrees of generalisation: (in the 3 functions, the parameter n is the max length of the series of 1 considered) this one answer exactly to your question: fct1[li_, n_] := Module[{inter, res, pourN}, pourN[l_List, i_Integer] := Array[Position[Split[l], Table[1, {#}]] &, {i}] // Flatten; inter = pourN[li, n]; res = (Length[#] + 1 &) /@ ((Take[Split[li], # - 1] // Flatten) & /@ inter) ]; example: in > fct1[li, 5] out > {3, 6, 10, 16} but some problems arise when there are some series of '1' of same length in the list and when these series are in disorder (example in the list lolo): in > fct1[lolo, 5] out > {3, 6, 12, 19, 28, 15, 22} when this result is given, whe know the position of the series but we ignore the length of each one... this one answer your question in giving: {the number of 1 in the serie, the position of the serie} fct2[lis_, n_] := Module[{inter1, inter2, res, pourN}, pourN[l_List, i_Integer] := Array[({Position[Split[l], Table[ 1, {#}]], #} // Flatten) &, {i}]; inter1 = pourN[lis, n] // Select[#, Length[#] >= 2 &] &; inter2 = Table[{#[[i]], Last[#]}, {i, 1, Length[#] - 1}] & /@ inter1 // Flatten[#, 1] &; res = {#[[2]], Length[#[[1]]] + 1} & /@ ({Take[Split[ lis], #[[1]] - 1] // Flatten, #[[2]]} & /@ inter2) ]; for example: in > fct2[li, 5] out > {{1, 3}, {2, 6}, {3, 10}, {4, 16}} this one is the more general: it gives the positions of all the series of character 's' with max length 'n' in the list with their positions: fct3[lis_, s_, n_] := Module[{inter1, inter2, res, pourN}, pourN[l_List, i_Integer] := Array[({Position[Split[l], Table[ s, {#}]], #} // Flatten) &, {i}]; inter1 = pourN[lis, n] // Select[#, Length[#] >= 2 &] &; inter2 = Table[{#[[i]], Last[#]}, {i, 1, Length[#] - 1}] & /@ inter1 // Flatten[#, 1] &; res = {#[[2]], Length[#[[ 1]]] + 1} & /@ ({Take[Split[ lis], #[[1]] - 1] // Flatten, #[[2]]} & /@ inter2) ]; for example: in > fct3[lulu, d, 5] out > {{2, 11}, {2, 20}, {3, 15}, {4, 3}} in > fct3[lulu, d, 2] out > {{2, 11}, {2, 20}} regards Rudy