【问题标题】:How to compare each element of two lists in python如何在python中比较两个列表的每个元素
【发布时间】:2019-03-06 02:03:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: python list comparison-operators


    【解决方案1】:

    列表理解:

    [item in b for item in a]
    

    这会以类似于以下代码的方式创建一个新列表:

    newList = []
    for item in a:
        newList.append(item in b)
    

    如果item 存在于b 中,则item in b 的计算结果为True,否则计算结果为False


    正如 cmets 中提到的(感谢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 来说看起来很新
    • @Bazingaa 当然。
    • 您可以通过将b 设为一个集合来使时间复杂度呈线性。
    【解决方案2】:

    因为 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'])。不认为这值得一个新的答案,但会是你的一个很好的补充。
    【解决方案3】:

    使用 list comprehension 我们可以检查项目是否在比较的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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 2019-09-22
      • 2019-12-07
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多