Solutions
As mentioned in the comments you could use
Select[list1, list2~MemberQ~First[#] &]
Another way is to use patterns, i.e.
Cases[list1, {Alternatives @@ list2, __}]
or
Pick[list1, First@Transpose@list1, Alternatives @@ list2]
How the pattern based work:
Alternatives @@ list2
(* Out: 1 | 2 | 3 | 4 *)
i.e. {Alternatives @@ list2, __} is the same as {1 | 2 | 3 | 4,__} which will match either 1, 2, 3 or 4 as the first element of the list. __ matches one of several more elements, whatever they are. Cases tests each element in its first argument (list1) to see if it matches the pattern, then it selects those that match. You can test whether your pattern matches the rights elements like this:
MatchQ[#, {Alternatives @@ list2, __}] & /@ list1
(* Out: {True, True, True, False} *)
Pick[list, sel, patt] selects those elements in list for which the corresponding elements in sel match the pattern patt. First@Transpose@list1 selects the first column from the matrix list1, this is the first element in each sublist. Therefore the pattern patt is just 1 | 2 | 3 | 4.
Select[list1, MemberQ[list2,#[[1]]]]my brackets or ordering might be wrong... – tkott Mar 24 '15 at 13:25Select[list1, (MemberQ[list2, #[[1]]] &)]– LLlAMnYP Mar 24 '15 at 13:26list1 = {{1, 2, 3, 4}, {1, 2, 5, 6}, {2, 3, 4, 5}, {5, 6, 7, 8}}; list2 = {1, 2, 3, 4}; N0 = Length[list1]; M0 = Length[list2]; lst = {}; For[i = 1, i <= N0, i++, { candidate = list1[[i, 1]]; found = False; For[j = 1, j <= M0, j++, { If[list2[[j]] == candidate, found = True; Break[] ] } ]; If[found, AppendTo[lst, list1[[i]]]] } ]; lstwhich gives{{1, 2, 3, 4}, {1, 2, 5, 6}, {2, 3, 4, 5}}nowadays functional programming took all the fun away ;) – Nasser Mar 24 '15 at 13:51Cases[list1, {#, __}] & /@ list2– Chris Degnen Mar 24 '15 at 20:43