如何返回布尔值列表以检查一个列表的元素是否在另一个列表中

5 投票
3 回答
6084 浏览
提问于 2025-04-17 13:17

我有两个列表:

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]

撰写回答