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

3
我正在寻找一个类似于R语言中的%in%运算符的Python运算符。它会比较一个列表中的所有元素和另一个列表中的所有元素,并返回一个布尔数组。它将执行以下操作:
a=['word1','word2','word3','word4']
b=['word2','word4']
a *%in%* b
>>False True False True

我找到的最接近的方法是pd.str.contains,但它不支持向量化操作,即它只能查找一个元素。希望有人知道更好的方法。

3个回答

4
列表推导式:
[item in b for item in a]

这将以类似以下代码的方式创建一个新列表:
newList = []
for item in a:
    newList.append(item in b)

item in b 如果 item 存在于 b 中,那么它将会评估为 True,否则将评估为 False


正如评论中提到的(感谢 Paul Rooney!),如果你把 b 转换为一个集合,则可以提高速度:

b_set = set(b)
result = [item in b_set for item in a]

这是因为如果b是一个集合,查找操作item in b需要一致的时间,而如果b是一个列表,则必须比较每个单独的项目,直到找到匹配项为止。如果b很小,则速度提高并不明显,但对于包含数百个元素的列表b,这可以大大提高效率。

添加一些解释。OP 看起来对 Python 不太熟悉。 - Sheldore
@Bazingaa 当然可以。 - iBug
你可以通过将“b”设置为一个集合,使时间复杂度变为线性。 - Paul Rooney

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]

相关(由于OP提到了Pandas并且来自R),pd.Series(['word1', 'word2', 'word3', 'word4']).isin(['word2', 'word4'])。我认为这不值得新回答,但会是你回答的一个很好的补充。 - alkasm

0

使用列表推导式,我们可以检查项目是否在比较的列表中,并在是的情况下返回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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接