【问题标题】:how to keep elements of a list based on another list [duplicate]如何根据另一个列表保留列表的元素[重复]
【发布时间】:2016-03-21 04:41:03
【问题描述】:

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

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

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

我想要做的是保留 list1 的所有那些也在 list2 中的元素。 结果应该是:

outcome= ['a','a','c']

【问题讨论】:

  • 发布你的尝试..
  • @AvinashRaj 我猜一个班轮硬件问题可以解决:-)
  • @BhargavRao 但我们可以在不使用 itertools 的情况下实现结果..
  • 好问题。就个人而言,使用 numpy 可能是最好的方法。即使两个列表很大,numpy.isin 函数也很快。检查以下链接以获取更多详细信息。 > docs.scipy.org/doc/numpy/reference/generated/numpy.isin.html

标签: python list filter


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 第三种选择:使用filter()
  • list(filter(list2.__contains__, list1))
  • @falsetru 这不会与 OP 返回的相反吗?
  • @BhargavRao,两者(答案和评论中的代码)都返回['a', 'a', 'c']
  • 对不起,我的错。我很困惑。
【解决方案2】:

numpy 的另一种方法:

import numpy as np

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

【讨论】:

    【解决方案3】:

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

    list 调用是必要的,因为 filterfalse 返回一个 itertools 对象。

    你也可以使用filter函数

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 2021-03-08
      • 2018-07-14
      • 2021-03-20
      • 2015-03-31
      • 1970-01-01
      相关资源
      最近更新 更多