繁体   English   中英

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

[英]How to get the index of specific item in python matrix

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

以其他方式,我想使用列表执行与此源代码相同的操作。

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

此致

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

(编辑:请参阅hiro 主角的替代 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 []

一个(在我看来)更 Python 版本的FlipTack 算法

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

既然您说您是初学者,请原谅我,如果您已经知道以下一些内容。 以防万一我将描述您可以用来编写自己的函数或更好地理解此处发布的其他答案的基本逻辑:访问列表特定行中的元素,例如,如果您想获取第一个元素并将其保存在变量中:

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

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

例如:

如果您输入的是一维向量:

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]

对于二维向量:

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

只是想抛出另一个解决方案,因为我没有在上面看到它:

def find(matrix, value):
    value_indexs = [ ( matrix.index(row), row.index(value) ) for row in matrix if value in row]
    return value_indexs

例子:

matrix = [
    [0, 1, 2],
    [3, 4, 5, 6],
    [7, 8, 9, 0]
]
find(matrix, 0) 

返回:[(0,0), (2,3)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM