如何获取python矩阵中特定项的索引

时间:2017-01-02 17:27:16

标签: python python-3.x

我是Python编程语言的新手。我正在寻找如何获取矩阵中特定元素的索引(行和列)。

在其他方面,我想使用列表与此源代码一样。

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

最好的问候

4 个答案:

答案 0 :(得分:3)

这是一个简单的函数,它将坐标作为元组返回(如果没有找到索引则返回None)。请注意,这适用于2D矩阵,并返回矩阵中元素的第一个实例。

(编辑:请参阅hiro protagonist's answer了解替代Pythonic版本)

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 []

答案 1 :(得分:2)

a(在我看来)FlipTack's altorithm的更多pythonic版本:

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(没有第二个参数)一样,这只会找到第一次出现。

答案 2 :(得分: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和hiro主角的函数将这个逻辑包装在一个很好的紧凑程序中,它搜索整个二维列表,比较元素直到找到所需的元素,然后返回一个索引元组或继续搜索重复元素。请注意,如果您的列表保证排序,则可以跨行和列使用二进制搜索算法并更快地获得答案,但现在无需担心。 希望这会有所帮助。

答案 3 :(得分:0)

您还可以在函数中添加标签,以搜索输入矩阵/列表的出现次数。

例如:

如果您输入的是1D矢量:

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)]