在Python中如何检查列表(例如l1
)的每个元素,是否包含在另一个列表(例如l2
)中。
l1 = ['a', 'b', 'c']
l2 = ['b', 'c']
所需的输出为[False, True, True]
。所以我真的想要一个布尔向量len(l1)
,而不是像['b', 'c']
之类的交集。我的问题与this question不同,因为我的问题不足以知道是否第二个列表中的第一个列表中有 any 个元素,但是哪些元素是,哪些不是。
答案 0 :(得分:2)
[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)
如果有两个列表,l1
和l2
,并且我们必须检查l1
中是否存在l2
的每个元素,最好转换{{ 1}}到l2
,并检查set
中l1
每个元素的成员资格。
成员资格测试花费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]