2014-08-29 90 views
-2

我有嵌套數查找列表

my_list = [[0,1,2,3,4,5],[6,7,8,9,10,11],[12,56,86,9],[55,53,12]] 

和列表的列表中的號碼,我想知道哪個子表給定的號碼屬於

舉例來說,如果我在尋找1號

算法應該返回0,因爲1屬於第一子列表。

如果我要找的9,我應該得到1和2

我見過已經這裏有一個解決方案 Python search in lists of lists

但問題是,我有一個非常合作大量的列表和循環不是最好的解決方案。

是否有可能會派上用場任何構建的Python功能?

+0

使用[generator](http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python/231855#231855)。看看你提供的問題的底部答案。 – RickyA 2014-08-29 13:56:07

+1

*爲什麼*循環不是最好的解決方案?你的數據結構有什麼屬性可以在沒有循環的情況下找到元素? – 2014-08-29 13:56:10

+0

你會找到多個項目(比如'O(1)'成員資格測試的好處,使得'set's的前期成本被超過了? – jonrsharpe 2014-08-29 14:00:40

回答

0

列表是不最好的數據結構來查找元素,你應該考慮使用集合,這會給你O(1)的查找時間。有更好的數據結構和算法,如果您的列表沒有交點,但是既然你想所有名單,有較少的替代品。

lsts = [[0,1,2,3,4,5], [6,7,8,9,10,11], [12,56,86,9], [55,53,12]] 
sets = map(set, lsts) 

def find(iterables, element): 
    return [i for i, iterable in enumerate(iterables) if element in iterable] 
0

你可以使用列表理解,但不能肯定,這將是更好的優化比一個循環:

def search(my_list, n) 
    result = [i for i in range(len(my_list)) if n in my_list[i]] 
    return result 
2

您可以使用列表解析如下圖所示的例子。對於每個列表,它檢查數值是否在列表中。請注意,這仍然使用迭代(在列表理解的形式),但除非你使用類似numpy(這是內置),那麼你將不得不重複。

my_list = [[0,1,2,3,4,5],[6,7,8,9,10,11],[12,56,86,9],[55,53,12]] 

def find(my_list, number): 
    return [i for i, x in enumerate(my_list) if number in x] 

print(find(my_list, 9)) 
# [1, 2] 
0

優化是一個有趣的話題,根據問題可以有很多不同的方法。

在這種情況下,如果數據是有序的,那麼你可以開始使用的假設,以儘量減少你需要使用昂貴的in關鍵字倍。

即使在每個時間子表和基於訂購的第一個元素列表,這些列表。

所以首先作出這樣的工作,像這樣一類函數(我把它留給你)

>>> my_list = [[0,1,2,3,4,5],[6,7,8,9,10,11],[12,56,86,9],[55,53,12]] 
>>> my_sort_func(my_list) 
>>> print my_list 
[[0,1,2,3,4,5],[6,7,8,9,10,11],[9,12,56,86],[12,53,55]] 

現在你可以設計一個更精簡的搜索功能

/* 
* @pre my_list is sorted 
*/ 
def search(my_list, key): 
    result = [] 
    for index, l in enumerate(my_list): 
     if(l[0] > key): 
      break 
     if(l[-1] < key): 
      continue 
     if (key in l): 
      result.append(index) 
    return result