如何在Python中检查列表中的每个元素,是否包含在另一个列表中?

时间:2019-05-10 11:53:21

标签: python list boolean-expression comparison-operators

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

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

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

6 个答案:

答案 0 :(得分:2)

使用list comprehension

[x in l2 for x in l1]

说明:

  • for x in l1部分开始,我发现它最好理解:创建了一个临时变量x并循环了l1中的所有元素,类似于for loop
  • 现在针对每个x都检查它是否在l2中(因此in中的x in l2与{{1} }在in中。

答案 1 :(得分:1)

如果有两个列表,l1l2,并且我们必须检查l1中是否存在l2的每个元素,最好转换{{ 1}}到l2,并检查setl1每个元素的成员资格。

成员资格测试花费set(l2)时间O(n),花费lists时间O(1)。使用sets会将所需代码的时间复杂度降低到set,否则将是O(n)

O(n2)

输出:

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}')

答案 2 :(得分:0)

这也可行

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

result = []
for i in l1 : 
  result.append(i in l2)

但是很长

答案 3 :(得分:0)

您可以使用numpy array和函数numpy.in1d

import numpy as np

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

答案 4 :(得分:0)

检查元素是否在列表中需要O(n)个操作,如果要重复多次,则值得使用double对其成员资格进行O(1)摊分的set

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

(从numpy借用命名约定)

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

答案 5 :(得分:0)

使用lambda

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

res = list(map(lambda x: x in l2, l1))

print(res)

输出

[False, True, True]