2
$\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
    $\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 Mar 25 '14 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 Mar 25 '14 at 15:41
7
$\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$
  • 1
    $\begingroup$ Scan[ If[#[[-1]] === true, Sow[#]] &, list] // Reap $\endgroup$ – Kuba Mar 25 '14 at 16:21
  • 1
    $\begingroup$ Extract[list, Position[list, true][[;; , {1}]]] $\endgroup$ – Kuba Mar 25 '14 at 16:21
  • $\begingroup$ Pick[list, list[[All, 5]], true] $\endgroup$ – Kuba Mar 5 '15 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$

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.