检查列表a中的项是否在列表b中找到,并返回列表c,其中列表b的匹配索引在Python中

时间:2015-06-12 16:35:17

标签: python list nltk

我有列表a = ["string2" , "string4"]和列表b = ["string1" , "string2" , "string3" , "string4" , "string5"],我想检查列表中的“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等)另一个单词列表(停用词列表ex:stopwords = ["string312" , "string552" , string631"])如果找到我想知道他们在我的元组列表中的索引是通过创建另一个列表来存储这些索引,如果没有找到则保持为空。

5 个答案:

答案 0 :(得分:4)

您可以使用第二个列表中的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]

答案 1 :(得分:1)

您发布的代码的延续:

SELECT 
CAST(NULL AS decimal(18,2)) AS C1, 
CAST(NULL AS decimal(18,2)) AS C2, 
CAST(NULL AS decimal(18,2)) AS C3, 
CAST(NULL AS varchar(1)) AS C4, 
CAST(NULL AS decimal(18,2)) AS C5, 
CAST(NULL AS decimal(18,2)) AS C6, 
CAST(NULL AS decimal(18,2)) AS C7, 
CAST(NULL AS decimal(18,2)) AS C8, 
CAST(NULL AS varchar(1)) AS C9, 
CAST(NULL AS timestamp) AS C10
FROM  ( SELECT CAST(1 AS int) AS X FROM SYSIBM.SYSDUMMY1 ) AS SingleRowTable1
WHERE CAST('t' AS boolean) = CAST('f' AS boolean)

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您可以使用enumerate上的b制作元素>索引字典。这具有线性时间复杂度,但在完成此步骤后,所有索引查找将处于恒定时间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]

答案 4 :(得分:0)

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

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

您可以转换回来' set3'到列表并使用列表理解。

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