如何根据另一个列表保留列表的元素。

10

我有两个列表,看起来像这样:

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

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

我想做的是保留list1中与list2相同的所有元素。 结果应该是:
outcome= ['a','a','c']

5
发布你的尝试。 - Avinash Raj
@AvinashRaj 我觉得SO上的一行HW问题可以解决 :-) - Bhargav Rao
@BhargavRao 但是我们可以不使用itertools实现结果。 - Avinash Raj
很好的问题。个人认为,使用numpy可能是最好的方法。即使两个列表很大,numpy.isin函数也非常快速。请查看以下链接以获取更多详细信息。> https://docs.scipy.org/doc/numpy/reference/generated/numpy.isin.html - Martin He
3个回答

19

使用 in 运算符,可以检查一个元素是否在序列中。

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

使用列表推导式:

>>> 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']

但是x in list不够高效。您最好将list2转换为set对象。

>>> set2 = set(list2)
>>> [x for x in list1 if x in set2]
['a', 'a', 'c']

第三种选择:使用 filter() - Delgan
1
list(filter(list2.__contains__, list1)) - falsetru
@falsetru 这样做不会返回与 OP 返回相反的结果吗? - Bhargav Rao
@BhargavRao,无论是答案中的代码还是评论中的代码都会返回['a','a','c'] - falsetru
抱歉,我的错。我感到困惑了。 - Bhargav Rao

7

从Python 3开始,请使用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']

filterfalse返回的是一个itertools对象,因此需要使用list函数进行转换。

你也可以使用filter函数。

>>> list(filter(lambda x: x in list2 , list1))
['a', 'a', 'c']

3

使用numpy的另一种替代方法:

import numpy as np

np.asarray(list1)[np.in1d(list1, list2)].tolist()
#['a', 'a', 'c']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接