9
$\begingroup$

I have a list from which I would like to extract sublists:

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 will be greatly appreciated!

$\endgroup$
1
  • 5
    $\begingroup$ you could make Thanks Listable and save yourself the /@ :D $\endgroup$
    – Sascha
    Oct 5, 2016 at 19:59

4 Answers 4

14
$\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$
1
  • $\begingroup$ This is one elegant answer! beautiful! $\endgroup$
    – alex
    Apr 16 at 10:34
13
$\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$
3
  • 5
    $\begingroup$ In the same vein: First[Split[#, #2 =!= X &]] & /@ lis $\endgroup$ Oct 5, 2016 at 19:06
  • $\begingroup$ @J.M. Maybe it deserve as a answer. :) $\endgroup$
    – yode
    Oct 6, 2016 at 7:05
  • $\begingroup$ I'd prefer you edit your answer instead, as it is too similar to yours. $\endgroup$ Oct 6, 2016 at 7:20
10
$\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$
1
  • 1
    $\begingroup$ It's worth noting that this one assumes that each sublist does contain an X. $\endgroup$ Oct 6, 2016 at 12:05
3
$\begingroup$

Using SequenceReplace:

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

SequenceReplace[#, {a___, X, b___} :> a] & /@ lis

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


If lists without an X need to be ignored, then it is better to execute:

DeleteCases[lis, _?(FreeQ[#, X] &)]

prior to running the modified list through the SequenceReplace command.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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