2015-06-05 59 views
1

嘗試使用元素查找子列表的索引。我不知道如何準確指出問題(這可能是爲什麼我在手工忽視它),但是我的問題是這樣的:在列表中查找子列表的索引

list1 = [[1,2],[3,4],[7,8,9]] 

我想要找的第一子列表列表1中其中7出現(在這種情況下,索引是2,但可能會非常長)。 (每個數字只出現在1個子列表中 - 或者根本不存在,這些列表僅包含整數) 也就是說,像

spam = My_find(list1, 7) 

功能將使垃圾郵件= 2 我可以嘗試循環進行布爾指數

[7 in x for x in lll] 

,然後的.index找到「真」 - (根據Most efficient way to get indexposition of a sublist in a nested list) 然而肯定不得不建立一個新的布爾列表是真的低效..

我的代碼開始與list1相對較小,但它不斷增加(最終將有一百萬數字安排在約5000分列表1的列表

有什麼想法?

回答

4

我可以嘗試循環進行布爾指數

[7 in x for x in lll] 

,然後.index找到「真」 ......但是肯定不必建立一個新的布爾名單實在是低效

你在這裏很親密。

首先,要避免構建列表,請使用生成器表達式而不是列表理解,只需將[]替換爲()即可。

sevens = (7 in x for x in lll) 

但是,你怎麼做的.index相當於當你有一個任意迭代,而不是一個列表?您可以使用enumerate將每個值與其索引相關聯,然後只需用filterdropwhile或另一個生成器表達式篩選出非七進制數,然後next將爲您提供第一個True的索引和值。

例如:

indexed_sevens = enumerate(sevens) 
seven_indexes = (index for index, value in indexed_sevens if value) 
first_seven_index = next(seven_indexes) 

你當然也可以摺疊所有的這成一個大的表現,如果你想要的。

而且,如果你仔細想想,你根本不需要這個初始表達式;你可以這樣做以後過濾步驟中:

first_seven_index = next(index for index, value in enumerate(lll) if 7 in value) 

當然,這將引發StopIteration例外,而不是ValueError表達,如果沒有七人欖球賽,但除此之外,它做同樣的事情,你的原代碼,但沒有建立清單,並且在第一場比賽後沒有繼續測試數值。

+0

謝謝 - 非常清楚,正是我想要的。 – CastleH