0

I have two huge lists: list1 and list2.

I would like to keep elements of list1, only if their first key is part of list2.

Example:

list1 = {{aa, 2, 5}, {be, 1, 5}, {ce, 5, 2}, {de, 1, 20}, {ee, 5, 2}}

list2 = {aa, ce, de}

Expected resulted:

list1 = {{aa, 2, 5}, {ce, 5, 2}, {de, 1, 20}}

I tried Pick, but I couldn't find a way. I think I have to look for a pattern that says "Pick element only if element belongs to list2"? What could it be?

My lists are very large so I can't do it manually.

m0nhawk
  • 3,867
  • 1
  • 20
  • 35
Cancan
  • 249
  • 2
  • 7

2 Answers2

2

Some additional methods

list1 = {{aa, 2, 5}, {be, 1, 5}, {ce, 5, 2}, {de, 1, 20}, {ee, 5, 2}};

list2 = {aa, ce, de};

Select[list1, MemberQ[list2, #[[1]]] &]

{{aa, 2, 5}, {ce, 5, 2}, {de, 1, 20}}

Cases[list1, _?(MemberQ[list2, #[[1]]] &)]

{{aa, 2, 5}, {ce, 5, 2}, {de, 1, 20}}

Pick[list1, MemberQ[list2, #[[1]]] & /@ list1]

{{aa, 2, 5}, {ce, 5, 2}, {de, 1, 20}}

DeleteCases[list1, _?(! MemberQ[list2, #[[1]]] &)]

{{aa, 2, 5}, {ce, 5, 2}, {de, 1, 20}}

DeleteCases[list1, _?(FreeQ[list2, #[[1]]] &)]

{{aa, 2, 5}, {ce, 5, 2}, {de, 1, 20}}

Bob Hanlon
  • 157,611
  • 7
  • 77
  • 198
1
Select[list1, MemberQ[list2, #[[1]]] &]
bbgodfrey
  • 61,439
  • 17
  • 89
  • 156
sonright
  • 141
  • 5