【问题标题】:Check if items in list a are found in list b and return list c with matching indexes of list b in Python检查列表 a 中的项目是否在列表 b 中找到并返回列表 c 与 Python 中列表 b 的匹配索引
【发布时间】:2015-08-28 18:13:51
【问题描述】:

我有列表 a = ["string2" , "string4"] 和列表 b = ["string1" , "string2" , "string3" , "string4" , "string5"] 并且我想检查列表 a 中的“string2”和“string4”是否与列表 b 中的匹配,如果匹配,则将列表 c 及其对应的索引添加到列表 b所以列表 c 应该是[1,3]

到目前为止我的代码:

for x in a:
    for y in b:
        if x == y:
            print (x)

所以我设法将它们打印出来,但不知道如何获取索引。

现在这是我的问题的简单版本,我可以像这样解决它,但只是为了好玩,我会告诉你整个事情。

我有一个使用 nltk.word_tokenize 生成的元组列表,格式如下 [('string1', 'DT'), ('string2', 'NNP'), ('string3', 'NNP'), ('string4', 'NNP'), ('string5', 'VBZ'), ("string6", 'RB')],我想检查在另一个列表中找到的单词(string1、string2、string3 等)的女巫单词(停用词列表前:stopwords = ["string312" , "string552" , string631"]),如果找到我想知道它们在我的元组列表中的索引,方法是创建另一个列表来存储这些索引,如果没有找到则保持为空。

【问题讨论】:

    标签: python list nltk


    【解决方案1】:

    您可以使用第二个列表中的index,同时在列表推导中迭代第一个列表的元素。

    >>> a = ["string2" , "string4"]
    >>> b = ["string1" , "string2" , "string3" , "string4" , "string5"]
    >>> c = [b.index(i) for i in a]
    >>> c
    [1, 3]
    

    如果一个元素可能在a 中但不在b 中,那么您可以稍微修改一下

    >>> [b.index(i) for i in a if i in b]
    [1, 3]
    

    【讨论】:

    • 谢谢!如果我需要查找列表 a 中已在 b 中找到的元素的索引怎么办?在我的示例中,结果应该是 [0,1] 但它可能是 [5,30,88]
    【解决方案2】:

    您发布的代码的延续:

    c = []
    for x in a:
       for y in b:
           if x == y:
               print(x)
               c.append(b.index(x))
    

    【讨论】:

      【解决方案3】:

      使用enumerate 结合列表推导直接获取列表中的索引。

      >>> [i for i,j in enumerate(b) if j in a]
      [1,3]
      

      【讨论】:

        【解决方案4】:

        您可以通过在b 上使用enumerate 来制作元素-> 索引的字典。这具有线性时间复杂度,但是在您完成此步骤后,您的所有索引查找都将在恒定时间 O(1) 中进行,并且您还可以轻松查看是否无法找到来自 a 的值在b 中,因为dict.get 将返回None。您还可以通过首先检查字典中是否存在其元素来对 a 执行 O(1) 过滤操作,这也使您的第二个循环具有线性时间复杂度。

        >>> a = [50, 150, 250]
        >>> b = list(range(200))
        >>> bindex = {x: i for i, x in enumerate(b)}
        >>> [bindex.get(x) for x in a]
        [50, 150, None]
        >>> [bindex[x] for x in a if x in bindex]
        [50, 150]
        

        【讨论】:

          【解决方案5】:

          如果您对集合感到满意,可以使用集合的交集属性。

          set1 = set(a)
          set2 = set(b)
          set3 = a & b    #intersection
          

          您可以将“set3”转换回列表并使用列表推导。

          c = list(set3)
          [c.index(i) for i in c]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-25
            • 2016-07-14
            • 2016-11-08
            相关资源
            最近更新 更多