如何返回布尔值列表以检查一个列表的元素是否在另一个列表中
我有两个列表:
A = [1,2,3,4,5,6,7,8]
B = [2,3,4]
我想得到一个布尔值列表,长度和列表A一样。这个布尔值列表的每个位置都表示列表A中对应位置的元素是否在列表B中出现过。返回的结果应该是:
[False, True, True, True, False, False, False, False]
虽然写一个函数来实现这个很简单,但我想知道在Python中有没有一种标准的方法来做到这一点。
在R语言中,对应的写法是:
which(A %in% b)
3 个回答
3
另一种写法(但因为使用了lambda,所以会慢一些):
>>> A = [1,2,3,4,5,6,7,8]
>>> B = [2,3,4]
>>> S = set(B)
>>> map(lambda x: x in S, A)
[False, True, True, True, False, False, False, False]
4
在编程中,有时候我们需要让程序做一些事情,比如处理数据或者与用户互动。为了实现这些功能,程序通常会使用一些特定的代码块。这些代码块就像是程序的工具,帮助我们完成各种任务。
在这个例子中,
In [1]: A = [1,2,3,4,5,6,7,8]
In [2]: B = [2,3,4]
In [3]: map(B.__contains__, A)
Out[3]: [False, True, True, True, False, False, False, False]
就是一个这样的代码块。它可能包含了一些指令,告诉程序该怎么做。理解这些代码块的内容和作用,可以帮助我们更好地掌握编程的技巧。
12
使用列表推导式:
In [164]: A = [1,2,3,4,5,6,7,8]
In [165]: B = [2,3,4]
In [166]: [x in B for x in A]
Out[166]: [False, True, True, True, False, False, False, False]
如果 B
非常大,最好先把它转换成一个 set
。因为在集合中检查一个元素是否存在的速度是 O(1)
,而在列表中则是 O(n)
,也就是说,集合要快得多。
In [167]: b=set(B)
In [168]: [x in b for x in A]
Out[168]: [False, True, True, True, False, False, False, False]