即使重复,也可以从另一个列表中的列表中查找项目的索引

时间:2017-06-30 04:08:16

标签: python

This answer非常适合从另一个列表中的列表中查找项目的索引,但问题是,它只给它们一次。但是,我希望我的索引列表与搜索列表的长度相同。 这是一个例子:

thelist = ['A','B','C','D','E'] # the list whose indices I want
Mylist = ['B','C','B','E'] # my list of values that I am searching in the other list
ilist = [i for i, x in enumerate(thelist) if any(thing in x for thing in Mylist)]

使用此解决方案,ilist = [1,2,4]但我想要的是ilist = [1,2,1,4],以便len(ilist) = len(Mylist)。它省略了已找到的索引,但如果我的项目在列表中重复,则不会给我重复项。

4 个答案:

答案 0 :(得分:2)

thelist = ['A','B','C','D','E']
Mylist = ['B','C','B','E']
ilist = [thelist.index(x) for x in Mylist]

print(ilist)  # [1, 2, 1, 4]

基本上,"对于Mylist的每个元素,在thelist中获取其位置。"

这假设Mylist中的每个元素都存在于thelist中。如果元素多次出现在thelist中,则会占据第一个位置。

<强>更新

对于子串:

thelist = ['A','boB','C','D','E']
Mylist = ['B','C','B','E']
ilist = [next(i for i, y in enumerate(thelist) if x in y) for x in Mylist]

print(ilist)  # [1, 2, 1, 4]

更新2

这是一个使用下面评论中的示例在另一个方向上执行子串的版本:

thelist = ['A','B','C','D','E']
Mylist = ['Boo','Cup','Bee','Eerr','Cool','Aah']

ilist = [next(i for i, y in enumerate(thelist) if y in x) for x in Mylist]

print(ilist)  # [1, 2, 1, 4, 2, 0]

答案 1 :(得分:1)

下面的代码可以使用

ilist = [ theList.index(i) for i in MyList ] 

答案 2 :(得分:1)

从字符串到索引进行反向查找:

string_indices = {c: i for i, c in enumerate(thelist)}
ilist = [string_indices[c] for c in Mylist]

这避免了重复.index()查找的二次行为。

答案 3 :(得分:0)

如果数据可以隐式转换为ndarray,正如您的示例所示,您可以使用numpy_indexed(免责声明:我是其作者),以高效执行此类操作(完全向量化和NlogN)方式。

import numpy_indexed as npi
ilist = npi.indices(thelist, Mylist)

npi.indices本质上是list.index的数组泛化。此外,它有一个kwarg,可以让你控制如何处理缺失值等。