如何在python中比较两个列表的每个元素

时间:2018-09-30 23:39:46

标签: python list comparison-operators

我正在寻找一个类似于R中%in%的Python运算符。它将一个列表中的所有元素与另一个列表中的所有元素进行比较,并返回一个布尔数组。它将执行以下操作:

a=['word1','word2','word3','word4']
b=['word2','word4']
a *%in%* b
>>False True False True

我找到的最接近的东西是pd.str.contains,但没有向量化,即它只查找一个元素。希望有人知道。

3 个答案:

答案 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)