python:匹配矩阵和列表中的索引

时间:2013-11-16 08:23:58

标签: python list tuples

假设你有元组元组(看起来像一个矩阵)。 现在我想更改其内容,因此我将其转换为列表。 假设我有矩阵的行数和列数。

如何将矩阵中的索引与列表中的索引进行匹配?

提前完成。

3 个答案:

答案 0 :(得分:4)

使用列表,您只需再次使用[]运算符即可。所以,例如:

>>> a = [[1,2], [3, 4]]
>>> a[0][0]
1
>>> a[0][1]
2
>>> a[1][0]
3
>>> a[1][1]
4
>>> type(a)
<type 'list'>
>>> type(a[0])
<type 'list'>
>>> type(a[0][0])
<type 'int'>

解释很简单,第一次使用[]运算符时,会得到list,因此您可以再次使用[]运算符。像这样,你可以模拟一个矩阵。

如果你想找到索引,那么你可以使用这个漂亮的小函数:

def finder(value_to_find, matrix):
    for r, row in enumerate(matrix):
        for c, col in enumerate(row):
            if col == value_to_find:
                return r, c

并且,对于演示:

>>> a = [[1,2], [3, 4]]
>>> a[0][0]
1
>>> a[0][1]
2
>>> a[1][0]
3
>>> a[1][1]
4
>>> def finder(value_to_find, matrix):
    for r, row in enumerate(matrix):
        for c, col in enumerate(row):
            if col == value_to_find:
                return r, c
>>> finder(4, a)
(1, 1)

以下是对评论的解释:

def finder(value_to_find, matrix):
    """
    Function to find the indexes of a given value, on first notice
    @param value_to_find: The value we need to find
    @param matrix: The matrix we are to work with
    @return: A tuple of row, column
    """
    # Looping over the rows (lists within the main matrix)
    for r, row in enumerate(matrix):   # Using enumerate returns the index, r and the value row (which is a list)
        for c, col in enumerate(row):  # Looping over the values in each row, with index c and value col
            if col == value_to_find:  # If the col is equal to the value we want, then we return the row, column tuple
                return r, c

如果您有一维矩阵,那么您可以从Hyperborius中查看此解决方案:

listindex = row * length_of_row + column

答案 1 :(得分:3)

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

如果a是矩阵,我们可以使用两个参数:行和列来访问各个元素。在这里,row表示列表的数量,column将引用列表中元素的位置。

因此,column只是引用列表中元素的常规方式,而row只不过是引用列表中列表的常规方式。 rowcolumn都是基于零的索引。

格式为

a[row][column]

当我们说

a[row]

这意味着,从列表列表中获取位置row以及我们说

时的列表
a[row][column]

我们说,从我们想要的列表中,选择位置column的元素。

答案 2 :(得分:0)

假设你有一个元组元组:

>>> a = ((1,2,3),(4,5,6),(7,8,9))

你转换成一个平面列表,大概使用这样的技术(Joel Cornett,https://stackoverflow.com/a/10636583/219229):

>>> b = list(sum(a, ()))
>>> b
[1, 2, 3, 4, 5, 6, 7, 8, 9]

这样b有效地丢失了原始的多维索引。如果您已经知道a中的原始索引,则可以在b中计算其索引,如下所示:

>>> matrix_width = len(a[0])
... (assuming you have the indices i,j) ...
>>> index_in_b = j*matrix_width + i 
>>> item_to_find = b[index_in_b]

如果将其扩展为多维数组(如3d数组),并且索引为ijk,那么它应为index = i + (j * width) + (k * width * span),其中width = a[0][0]span = a[0]


P / S:如果您想将其转换为列表列表,可以使用以下简写:

>>> b = list[map(list,a)]  # using map
>>> b = [list(x) for x in a]  # using list comprehension