我有列表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"]
)如果找到我想知道他们在我的元组列表中的索引是通过创建另一个列表来存储这些索引,如果没有找到则保持为空。
答案 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]