9

I have two lists looking like:

list1 = ['a','a','b','b','b','c','d','e','e','g','g']

list2 = ['a','c','z','y']

What I want to do is to keep all those elements of list1 that are also in list2. the outcome should be:

outcome= ['a','a','c']
Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
Blue Moon
  • 4,421
  • 20
  • 52
  • 91

3 Answers3

18

Using in operator, you can check whether an element is in a seqeunce.

>>> list2 = ['a','c','z','y']
>>> 'x' in list2
False
>>> 'y' in list2
True

Using list comprehension:

>>> list1 = ['a','a','b','b','b','c','d','e','e','g','g']
>>> list2 = ['a','c','z','y']
>>> [x for x in list1 if x in list2]
['a', 'a', 'c']

But x in list is not efficient. You'd better convert list2 to a set object.

>>> set2 = set(list2)
>>> [x for x in list1 if x in set2]
['a', 'a', 'c']
falsetru
  • 357,413
  • 63
  • 732
  • 636
7

From Python 3 onwards use itertools.filterfalse

>>> import itertools
>>> list1 = ['a','a','b','b','b','c','d','e','e','g','g']
>>> list2 = ['a','c','z','y']
>>> list(itertools.filterfalse(lambda x:x not in list2,list1))
['a', 'a', 'c']

The list call is necessary as filterfalse returns an itertools object.

You can also use the filter function

>>> list(filter(lambda x: x in list2 , list1))
['a', 'a', 'c']
Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
3

One alternative approach with numpy:

import numpy as np

np.asarray(list1)[np.in1d(list1, list2)].tolist()
#['a', 'a', 'c']
Colonel Beauvel
  • 30,423
  • 11
  • 47
  • 87