2013-08-04 56 views
1

我有2D列表,我需要搜索元素的索引。由於我begineer編程我用下面的功能:使用python在2D列表中搜索以找到x,y位置

def in_list(c): 
    for i in xrange(0,no_classes): 
     if c in classes[i]: 
      return i; 

    return -1 

這兒上課的是一個二維的列表,並no_classes表示的類的數量即列表中的第1 dimesntion。當c不在araray中時返回-1。有沒有我可以優化搜索?

+0

可以優化它,如果你將使用一個適當的數據結構,如集,或者如果你的清單預先進行排序,否則O(N^2)算法,你不能做到這一點更快 –

+0

@Roman Park:你可以提供一些關於優化這個的提示嗎? – ranger

+0

你在列表中有重複嗎?元素順序是否重要? –

回答

0

使用list.index(項目)

a = [[1,2],[3,4,5]] 

def in_list(item,L): 
    for i in L: 
     if item in i: 
      return L.index(i) 
    return -1 

print in_list(3,a) 
# prints 1 
+0

你應該添加嘗試,除非你想使用索引 - 請參閱文檔 - '返回值爲x的第一個項目列表中的索引。這是一個錯誤,如果沒有這樣的項目。[http://docs.python.org/2/tutorial/datastructures.html –

+0

這是不可能的,這裏會有錯誤,因爲我肯定在列表中,因爲它是一部分我們迭代的列表。除了這裏,不需要嘗試。 –

+0

哎呀,沒有看到,請編輯答案不知何故,我可以unvote我-1 –

1

你並不需要定義no_classes自己。使用enumerate()

def in_list(c, classes): 
    for i, sublist in enumerate(classes): 
     if c in sublist: 
      return i 
    return -1 
1

如果順序並不重要,你必須在你的數據沒有重複,我建議把你的二維表進組名單:

>>> l = [[1, 2, 4], [6, 7, 8], [9, 5, 10]] 
>>> l = [set(x) for x in l] 
>>> l 
[set([1, 2, 4]), set([8, 6, 7]), set([9, 10, 5])] 

之後,原來的功能會更快地工作,因爲set中元素的搜索是恆定的(而list中元素的搜索是線性的),所以你的算法變成O(N)而不是O(N^2)。

請注意,您不應該在您的函數中執行此操作,否則每次調用函數時都會進行轉換。

0

如果你的「2D」名單是矩形(相同數量的每個行的列),你應該把它轉換爲numpy.ndarray和使用numpy的功能做搜索:

a = np.array(c) 
i,j = np.where(a==element) 

ij將包含行和列索引,分別。

實施例:

a = np.array([[1,2], 
       [3,4], 
       [2,6]]) 
i,j = np.where(a==2) 
print i 
#array([0, 2]) 
print j 
#array([1, 0])) 
相關問題