2012-04-30 29 views
6

對於兩個列表,列表比賽中的Python:獲得一個子列表的指數在一個較大的列表

a = [1, 2, 9, 3, 8, ...] (no duplicate values in a, but a is very big) 
b = [1, 9, 1,...]   (set(b) is a subset of set(a), 1<<len(b)<<len(a)) 

indices = get_indices_of_a(a, b) 

如何讓get_indices_of_aarray(a)[indices] = b回報indices = [0, 2, 0,...]?有沒有比使用a.index更快的方法,這會花費太長時間?

製作b一套是一種匹配列表和返回索引的快速方法(請參閱compare two lists in python and return indices of matched values),但它會丟失第二個1的索引以及這種情況下的索引序列。

回答

12

一種快速方法(當a是一個大的列表)將是使用一個字典映射值a到指數:

>>> index_dict = dict((value, idx) for idx,value in enumerate(a)) 
>>> [index_dict[x] for x in b] 
[0, 2, 0] 

這將需要在平均情況下的線性時間,與使用a.index其會花費二次時間。

+0

+1。對於大型列表來說,這是一個很好的解決方案,它將大大減少所需的時間 - 自然而然地,在小列表中,字典的創建將花費比保存更多的時間。考慮到提問者對我的回答的評論,似乎涉及到大列表,所以這是想要的答案。 –

7

。假定我們正與小名單的工作,這是那麼容易,因爲:

>>> a = [1, 2, 9, 3, 8] 
>>> b = [1, 9, 1] 
>>> [a.index(item) for item in b] 
[0, 2, 0] 

在大名單,這將成爲相當昂貴。

(如果有重複,則第一次出現將始終是結果列表中引用的那個,如果not set(b) <= set(a),您將得到一個ValueError)。

+0

非常感謝!沒有重複,但a很大,b也不小,儘管len(b)<< len(a)。使用a.index(item)正在爲b中的每個值執行搜索...是否有更快的方法? – user1342516

+0

@ user1342516是的,看[interjay的回答](http://stackoverflow.com/a/10385786/722121)。 –

+0

你可以將此添加到你的解決方案,以消除ValueError的情況: [a.index(物品)b中物品的項目] –

相關問題