我正在寻找一个类似于R中%in%的Python运算符。它将一个列表中的所有元素与另一个列表中的所有元素进行比较,并返回一个布尔数组。它将执行以下操作:
a=['word1','word2','word3','word4']
b=['word2','word4']
a *%in%* b
>>False True False True
我找到的最接近的东西是pd.str.contains,但没有向量化,即它只查找一个元素。希望有人知道。
答案 0 :(得分:3)
列表理解:
[item in b for item in a]
这将以类似于以下代码的方式创建一个新列表:
newList = []
for item in a:
newList.append(item in b)
如果{{1}中存在item in b
,则True
的计算结果为item
,否则它将计算为b
。
如评论中所述(感谢Paul Rooney!),如果将False
设置为集合,则可以提高此速度:
b
这是因为,如果b_set = set(b)
result = [item in b_set for item in a]
是一个集合,则查找操作item in b
将花费一致的时间,而如果b
是一个列表,则必须比较每个项目,直到找到一个匹配的项目为止。
如果b
很小,则速度改进不会非常明显,但是对于包含数百个元素的列表b
来说,这可能是一个令人讨厌的改进。
答案 1 :(得分:1)
由于python并不是主要的数字语言或科学语言,因此它没有附带Matlab或R默认提供的某些功能。也就是说,numpy中几乎提供了您需要的所有这些语言/ scipy生态系统。例如,numpy具有一个in1d
函数:
import numpy
a = ['word1','word2','word3','word4']
b = ['word2','word4']
print(numpy.in1d(a, b))
# [False True False True]
答案 2 :(得分:0)
使用列表理解,我们可以检查项目是否在比较的list
中,如果是True
则返回False
l = [*True if i in b else False for i in a]
print(*l)
False True False True
扩展循环
l = []
for i in a:
if i in b:
l.append(True)
else:
l.append(False)