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)
。它省略了已找到的索引,但如果我的项目在列表中重复,则不会给我重复项。
答案 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,可以让你控制如何处理缺失值等。