how to keep elements of a list based on another list [duplicate]
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']
Solution 1:
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']
Solution 2:
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']
Solution 3:
One alternative approach with numpy:
import numpy as np
np.asarray(list1)[np.in1d(list1, list2)].tolist()
#['a', 'a', 'c']