检查列表 a 中的项目是否在列表 b 和 return 列表 c 中与列表 b 在 Python 中的索引匹配
Check if items in list a are found in list b and return list c with matching indexes of list b in Python
我有列表 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 等)在另一个单词列表(停用词列表 ex:stopwords = ["string312" , "string552" , string631"]
)中找到,如果找到,我想通过创建另一个存储这些列表的列表来了解它们在我的元组列表中的索引索引或如果找到 none 则保留为空。
您可以使用第二个列表中的 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]
您发布的代码的延续:
c = []
for x in a:
for y in b:
if x == y:
print(x)
c.append(b.index(x))
您可以在 b
上使用 enumerate
创建元素->索引的字典。这具有线性时间复杂度,但完成此步骤后,所有索引查找都将在常数时间 O(1) 内进行,并且您还将有一种简单的方法来查看 a
中的值是否不能在 b
中找到,因为 dict.get
将 return 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]
使用 enumerate 结合列表理解直接在列表中获取索引。
>>> [i for i,j in enumerate(b) if j in a]
[1,3]
如果您对集合感到满意,可以使用集合的交集 属性。
set1 = set(a)
set2 = set(b)
set3 = a & b #intersection
您可以将 'set3' 转换回列表并使用列表理解。
c = list(set3)
[c.index(i) for i in c]
我有列表 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 等)在另一个单词列表(停用词列表 ex:stopwords = ["string312" , "string552" , string631"]
)中找到,如果找到,我想通过创建另一个存储这些列表的列表来了解它们在我的元组列表中的索引索引或如果找到 none 则保留为空。
您可以使用第二个列表中的 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]
您发布的代码的延续:
c = []
for x in a:
for y in b:
if x == y:
print(x)
c.append(b.index(x))
您可以在 b
上使用 enumerate
创建元素->索引的字典。这具有线性时间复杂度,但完成此步骤后,所有索引查找都将在常数时间 O(1) 内进行,并且您还将有一种简单的方法来查看 a
中的值是否不能在 b
中找到,因为 dict.get
将 return 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]
使用 enumerate 结合列表理解直接在列表中获取索引。
>>> [i for i,j in enumerate(b) if j in a]
[1,3]
如果您对集合感到满意,可以使用集合的交集 属性。
set1 = set(a)
set2 = set(b)
set3 = a & b #intersection
您可以将 'set3' 转换回列表并使用列表理解。
c = list(set3)
[c.index(i) for i in c]