3

我有两个清单:

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)
4

3 回答 3

9

使用列表理解:

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]
于 2013-01-20T23:17:24.970 回答
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]
于 2013-01-20T23:38:02.837 回答
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]
于 2013-01-20T23:21:06.863 回答