7
$\begingroup$

I have a list from which I would like to create a sublist from this:

lis = {{a,X,b},{c,d,e,X,f},{h,j,X}}

giving:

res = {{a},{c,d,e},{h,j}}

i.e., deleting each X and its following elements from each sublist. Likely asked and answered, any pointers greatly appreciated!

$\endgroup$
  • 4
    $\begingroup$ you could make Thanks Listable and save yourself the /@ :D $\endgroup$ – Sascha Oct 5 '16 at 19:59
10
$\begingroup$

You can use ReplaceAll with an appropriate pattern in such cases

{{a, X, b}, {c, d, e, X, f}, {h, j, X}} /. {begin___, X, end___} :> {begin}

Note the use of named patterns of the BlankNullSequence variety that can stand for any sequence of zero or more expressions

$\endgroup$
9
$\begingroup$
lis = {{a, X, b}, {c, d, e, X, f}, {h, j, X}};
TakeWhile[#, # =!= X &] & /@ lis

{{a},{c,d,e},{h,j}}


From comment by Mr. J.M

First[Split[#, #2 =!= X &]] & /@ lis
$\endgroup$
  • 4
    $\begingroup$ In the same vein: First[Split[#, #2 =!= X &]] & /@ lis $\endgroup$ – J. M. is away Oct 5 '16 at 19:06
  • $\begingroup$ @J.M. Maybe it deserve as a answer. :) $\endgroup$ – yode Oct 6 '16 at 7:05
  • $\begingroup$ I'd prefer you edit your answer instead, as it is too similar to yours. $\endgroup$ – J. M. is away Oct 6 '16 at 7:20
7
$\begingroup$

Using Position

lis = {{a, X, b}, {c, d, e, X, f}, {h, j, X}};

#[[1 ;; Position[#, X][[1, 1]] - 1]] & /@ lis

(*  {{a}, {c, d, e}, {h, j}}  *)
$\endgroup$
  • $\begingroup$ It's worth noting that this one assumes that each sublist does contain an X. $\endgroup$ – Martin Ender Oct 6 '16 at 12:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.