2017-06-30 17 views
0

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

你正在尋找像這樣的問題是子字符串,或者只是完全匹配? – Ryan

+0

目前確切的匹配是好的,但子字符串似乎更強大 – durbachit

+0

這聽起來有點嫌疑。什麼是實際目的? (很多錯誤都是在魯棒性的幌子下發生的) – Ryan

回答

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發生多元素,它需要的第一個位置。

UPDATE

對於子:

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] 

UPDATE 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] 
+0

哦,我明白了,原來的問題在這裏與子字符串有誤,我在尋找相反的東西 - 假設'thelist = ['A' , 'B', 'C', 'd', 'E']'和'MYLIST = [ '啵', '杯', '蜂', 'Eerr', '冷', '啊哈']'和期望的輸出將是'[1,2,1,4,2,0]' – durbachit

+0

然後,只要將'如果x中的y'更改爲'如果y中x'。 – smarx

+1

我添加了該版本的更新。 – smarx

1

下面的代碼將工作

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

如果你的數據可以被隱式轉換爲ndarray,因爲你的榜樣意味着,你可以使用numpy_indexed(免責聲明:我是它的作者),以有效執行這種操作(完全矢量化和NlogN)的方式。

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

npi.indices本質上是list.index的數組泛化。此外,它有一個kwarg讓你控制如何處理缺失值等。

1

建立從字符串反向查找到指數:

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

這樣就避免了重複.index()查找的二次行爲。

相關問題