2017-01-02 182 views
1

我是Python編程語言的新手。我正在尋找如何獲得矩陣中特定元素的索引(行和列)。如何獲得python矩陣中特定項目的索引

在其他我的方式,我想要使用列表做這個源代碼相同。

myList=[1,10,54,85] 
myList.index(54) 

問候

+0

你在Python中稱爲'矩陣'?清單列表? numpy數組? ...? –

回答

3

這裏有一個簡單的函數(如果沒有索引被發現或None),它返回的座標作爲一個元組。請注意,這是用於2D矩陣,並返回矩陣中元素的第一個實例。

(編輯:見hiro protagonist's answer一種替代Python的版本)

def find(element, matrix): 
    for i in range(len(matrix)): 
     for j in range(len(matrix[i])): 
      if matrix[i][j] == element: 
       return (i, j) 

或者,如果你想找到的所有索引,而不是僅僅第一:

def findall(element, matrix): 
    result = [] 
    for i in range(len(matrix)): 
     for j in range(len(matrix[i])): 
      if matrix[i][j] == element: 
       result.append((i, j)) 
    return result 

你可以用它像這樣:

A = [[5, 10], 
    [15, 20], 
    [25, 5]] 


find(25, A) # Will return (2, 0) 
find(50, A) # Will return None 

findall(5, A) # Will return [(0, 0), (2, 1)] 
findall(4, A) # Will return [] 
2

a(in m Ÿ意見)的FlipTack's altorithm的更Python版本:

def find(element, matrix): 
    for i, matrix_i in enumerate(matrix): 
     for j, value in enumerate(matrix_i): 
      if value == element: 
       return (i, j) 

在Python它往往是更自然遍歷列表,而不僅僅是指數的要素;如果指數也需要,enumerate有幫助。這也更有效率。

注意:就像list.index(沒有第二個參數),這隻會查找第一個匹配項。

+0

好的!我經常忘記'枚舉'。 – FlipTack

1

既然你說你是初學者,請原諒我,如果你已經知道下面的一些。爲了以防萬一,我將描述可用於編寫自己的函數的基本邏輯,或者更好地理解在此處發佈的其他答案: 要訪問列表的特定行中的元素,例如,如果要獲取第一個元素元素並將其保存在一個變量中:

myList=[1,10,54,85] 
myvar = myList[0] # note that you access the first element with index 0 

myvar現在存儲1.爲什麼索引0?將該索引看作是「從元素列表開始多遠」的指標。換句話說,第一個元素距離開始的距離爲0。 如果您有像這樣的多維列表,該怎麼辦?

multi = [[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8] 
     ] 

現在你考慮行和列(當然,你可以有n維列表並繼續)。

如何檢索5?這是從行列表開始的1行到離開子列表開始2列的距離。 然後:

myvar = multi[1][2] 

檢索5.

FlipTack的和紘主角的功能包裹在漂亮的緊湊程序,其搜索整個2維列表這樣的邏輯,比較元件,直到所需的一個被發現,然後返回索引的元組或繼續搜索重複的元素。請注意,如果您的列表保證排序,則可以跨行和列使用二進制搜索算法,並快速獲得答案,但現在無需擔心。 希望這有助於。

0

您也可以添加一個標籤到您的功能來搜索輸入矩陣/列表的出現。

例如:

如果輸入是一維矢量:

def get_index_1d(a = [], val = 0, occurrence_pos = False): 
    if not occurrence_pos: 
     for k in range(len(a)): 
      if a[k] == val: 
       return k 
    else: 
     return [k for k in range(len(a)) if a[k] == val] 

輸出:

a = [1,10,54,85, 10] 
index = get_index_1d(a, 10, False) 
print("Without occurrence: ", index) 
index = get_index_1d(a, 10, True) 
print("With occurrence: ", index) 

>>> Without occurrence: 1 
>>> With occurrence: [1, 4] 

對於2D矢量:

def get_index_2d(a = [], val = 0, occurrence_pos = False): 
    if not occurrence_pos: 
     for k in range(len(a)): 
      for j in range(len(a[k])): 
       if a[k][j] == val: 
        return (k, j) 

    else: 
     return [(k, j) for k in range(len(a)) for j in range(len(a[k])) if a[k][j] == val] 

輸出:

b = [[1,2],[3,4],[5,6], [3,7]] 
index = get_index_2d(b, 3, False) 
print("Without occurrence: ", index) 
index = get_index_2d(b, 3, True) 
print("With occurrence: ", index) 

>>> Without occurrence: (1, 0) 
>>> With occurrence: [(1, 0), (3, 0)] 
相關問題