【问题标题】:How to check in Python for each element of a list, whether it is contained in another list?如何在 Python 中检查列表的每个元素,它是否包含在另一个列表中?
【发布时间】:2019-09-28 08:07:21
【问题描述】:

如何在 Python 中检查列表的每个元素(例如 l1),是否包含在另一个列表中(例如 l2)。

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']

所需的输出是[False, True, True]。所以我真的想要一个len(l1) 的布尔向量,而不是像['b', 'c'] 等的某种交集。我的问题与this question 不同,因为我的问题不足以知道是否存在any 来自第一个列表的元素包含在第二个列表中,但 哪些 元素是,哪些不是。

【问题讨论】:

标签: python list boolean-expression comparison-operators


【解决方案1】:

使用list comprehension

[x in l2 for x in l1]

解释:

  • 我发现最好理解它,从for x in l1 部分开始:创建一个临时变量x 并循环l1 中的所有元素,类似于for loop
  • 现在检查每个x 是否在l2 中(因此x in l2 中的inx in l1 中的in 具有不同的含义)。

【讨论】:

    【解决方案2】:

    如果有两个列表l1l2,我们必须检查l1的每个元素是否存在于l2中,最好将l2转换为set并检查用于set(l2)l1 的每个元素的成员资格。

    成员资格测试需要O(n) 时间listsO(1) 时间sets。使用set 会将所需代码的时间复杂度降低到O(n),否则会是O(n<sup>2</sup>)

    l1 = ['a', 'b', 'c']
    l2 = ['b', 'c']
    
    # Converting to a set takes O(n) time
    s2 = set(l2)  # {'c', 'b'}
    
    
    # Each of the following approaches takes O(n) time
    
    # Normal approach
    contains_n = []
    for x in l1:
        contains_n.append(x in s2)
    
    
    # Using a list comprehension
    contains_lc = [
        x in s2
        for x in l1
    ]
    
    
    # Using a functional approach
    contains_f = list(map(lambda x: x in s2, l1))
    
    
    print(f'contains_n: {contains_n}')
    print(f'contains_lc: {contains_lc}')
    print(f'contains_f: {contains_f}')
    

    输出:

    contains_n: [False, True, True]
    contains_lc: [False, True, True]
    contains_f: [False, True, True]
    

    【讨论】:

      【解决方案3】:

      您可以使用numpy array,以及函数numpy.in1d

      import numpy
      
      l1 = ['a', 'b', 'c']
      l2 = ['b', 'c']
      results = numpy.in1d(l1, l2)
      

      【讨论】:

        【解决方案4】:

        这个也可以

        l1 = ['a', 'b', 'c']
        l2 = ['b', 'c']
        
        result = []
        for i in l1 : 
          result.append(i in l2)
        

        但是很长

        【讨论】:

          【解决方案5】:

          检查一个元素是否在列表中需要 O(n) 次操作,如果您重复多次,则值得使用 set,它的成员资格测试为(摊销)O(1),给您

          def in1d(l1, l2):
            s2 = set(l2)
            return [x in s2 for x in l1]
          

          (借用numpy的命名约定)

          当列表变大(即每个元素超过几百个)时会更快

          【讨论】:

            【解决方案6】:

            使用lambda

            l1 = ['a', 'b', 'c']
            l2 = ['b', 'c']
            
            res = list(map(lambda x: x in l2, l1))
            
            print(res)
            

            输出

            [False, True, True]
            

            【讨论】:

              猜你喜欢
              • 2012-08-01
              • 1970-01-01
              • 2016-06-25
              • 2021-12-13
              • 2021-04-14
              • 1970-01-01
              • 2021-03-02
              • 2022-11-14
              • 2012-11-09
              相关资源
              最近更新 更多