我有两个清单:
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)
使用列表理解:
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]
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]
另一种编写方式(但由于 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]