6
$\begingroup$

I have a list of lists. For example,

 list = {{0,1,0,1,true},{0,0,0,0,false},{0,1,1,1,true},{1,1,1,1,false},{2,2,2,2,false}}

I'd like to find all lists that have the fifth element set to true. I'm looking for a general method that works for any lists in this format. How can I do this?

In the above example, the result that I'm looking for would be:

 {{0,1,0,1,true},{0,1,1,1,true}}

Sorry for such a basic question. I looked through the documentation for lists and couldn't find a way to do this. I'm still fairly new at Mathematica.

$\endgroup$
2
  • 3
    $\begingroup$ Have you tried Cases or Select? true is a proper symbol, but be aware that Mathematica represents truth values with True and False (not true) $\endgroup$
    – Szabolcs
    Commented Mar 25, 2014 at 15:34
  • 1
    $\begingroup$ Cases[{{0, 1, 0, 1, true}, {0, 0, 0, 0, false}, {0, 1, 1, 1, true}, {1, 1, 1, 1, false}, {2, 2, 2, 2, false}}, {___, true, ___}], see also DeleteCases e.g. in this answer $\endgroup$
    – Artes
    Commented Mar 25, 2014 at 15:41

4 Answers 4

9
$\begingroup$

There are several options and this is probably a duplicate although I can't seem to find it. A few of them to try out and learn:

list = {{0, 1, 0, 1, true}, {0, 0, 0, 0, false}, {0, 1, 1, 1, true}, 
        {1, 1, 1, 1, false}, {2, 2, 2, 2, false}};

Cases[list, {__, true}]
Select[list, Last@# === true &]
DeleteCases[list, {__, false}]
Pick[list, list, {__, true}] /. {} -> Sequence[]

all of which return

(* {{0, 1, 0, 1, true}, {0, 1, 1, 1, true}} *)

If your data has True and False instead of true and false, then you can simplify the Select example to:

Select[list, Last]
$\endgroup$
3
  • 1
    $\begingroup$ Scan[ If[#[[-1]] === true, Sow[#]] &, list] // Reap $\endgroup$
    – Kuba
    Commented Mar 25, 2014 at 16:21
  • 1
    $\begingroup$ Extract[list, Position[list, true][[;; , {1}]]] $\endgroup$
    – Kuba
    Commented Mar 25, 2014 at 16:21
  • 1
    $\begingroup$ Pick[list, list[[All, 5]], true] $\endgroup$
    – Kuba
    Commented Mar 5, 2015 at 14:07
3
$\begingroup$

as @Szabolcs pointed out, MMA is case sensitive and true is treated as a symbol and not as a variable, thus.

data = {{0, 1, 0, 1, true}, {0, 0, 0, 0, false}, {0, 1, 1, 1, 
true}, {1, 1, 1, 1, false}, {2, 2, 2, 2, false}};
Select[data, MatchQ[#[[5]], true] &]
(*{{0, 1, 0, 1, true}, {0, 1, 1, 1, true}}*)

If the data is entered accordingly (with True and False) then

data = {{0, 1, 0, 1, True}, {0, 0, 0, 0, False}, {0, 1, 1, 1, 
   True}, {1, 1, 1, 1, False}, {2, 2, 2, 2, False}};    
Select[data, TrueQ[#[[5]]] &]
(*{{0, 1, 0, 1, True}, {0, 1, 1, 1, True}}*)
$\endgroup$
2
$\begingroup$
list = {{0, 1, 0, 1, true}, {0, 0, 0, 0, false}, {0, 1, 1, 1, true},
        {1, 1, 1, 1, false}, {2, 2, 2, 2, false}};

Using ReplaceList:

ReplaceList[list, {___, s : {__, Except[false]}, ___} :> s]

(*{{0, 1, 0, 1, true}, {0, 1, 1, 1, true}}*)

Or using Replace:

Replace[list, s : {__, false} :> Nothing, {1}]

(*{{0, 1, 0, 1, true}, {0, 1, 1, 1, true}}*)
$\endgroup$
1
$\begingroup$
list = 
 {{0, 1, 0, 1, true}, {0, 0, 0, 0, false}, {0, 1, 1, 1, true}, 
  {1, 1, 1, 1, false}, {2, 2, 2, 2, false}}

Using SequenceSplit (new in 11.3)

Catenate @ SequenceSplit[list, {{__, false}}]

{{0, 1, 0, 1, true}, {0, 1, 1, 1, true}}

Using Delete

Delete[Position[list, {__, false}]] @ list

{{0, 1, 0, 1, true}, {0, 1, 1, 1, true}}

$\endgroup$

Your Answer

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

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