【问题标题】:Python - Read nth line in a matrixPython - 读取矩阵中的第 n 行
【发布时间】:2013-11-04 02:16:12
【问题描述】:

读取矩阵的第 n 个字母的最简单方法是什么?

我认为这可以通过一个简单的 for 循环来实现,但到目前为止我还没有运气。 到目前为止,我能做的最好的事情是使用一个不太优雅的计数:

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

count = 0
for n in matrix:
     print matrix[count][nth]
     count += 1

例如: 读取每行的第 0 个数字:1、2、1。 读取每行的第 4 个数字:6、2、8。

【问题讨论】:

  • 我刚刚意识到矩阵中的子列表长度不同,这是故意的吗?如果是,应该如何显示最长子列表的最后一个元素对应的行?

标签: python for-loop matrix line


【解决方案1】:

如果您经常需要执行此操作,您可以使用 zip(*matrix) 转置矩阵

>>> matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
>>> matrix_t = zip(*matrix)
>>> matrix_t
[(1, 2, 1), (3, 6, 6), (5, 1, 2), (2, 6, 6), (6, 2, 8), (2, 5, 2), (4, 7, 6)]
>>> matrix_t[0]
(1, 2, 1)
>>> matrix_t[3]
(2, 6, 6)

【讨论】:

    【解决方案2】:

    这里有一些东西可以处理不同长度的行(如您的示例),并支持 Python 对相对于序列末尾的负索引的特殊解释(通过将它们更改为len(s) + n):

    NULL = type('NULL', (object,), {'__repr__': lambda self: '<NULL>'})()
    
    def nth_elems(n):
        abs_n = abs(n)
        return [row[n] if abs_n < len(row) else NULL for row in matrix]
    
    matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
    
    print nth_elems(0)   # [1, 2, 1]
    print nth_elems(6)   # [4, 7, 6]
    print nth_elems(7)   # [1, <NULL>, <NULL>]
    print nth_elems(-1)  # [1, 7, 6]
    

    【讨论】:

      【解决方案3】:

      也许是这样?

      column = [row[0] for row in matrix]
      

      (对于第 0 个元素)

      【讨论】:

      • 效果很好。我用于 n in[row[nth] for row in matrix]
      【解决方案4】:
      In [1]: matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
      
      In [2]: nth=0
      
      In [3]: [row[nth] for row in matrix]
      Out[3]: [1, 2, 1]
      
      In [4]: nth=4
      
      In [5]: [row[nth] for row in matrix]
      Out[5]: [6, 2, 8]
      

      【讨论】:

        【解决方案5】:

        这是一个使用列表理解的解决方案:

        [x[0] for x in matrix]
        

        基本上等于:

        for x in matrix:
            print x[0]
        

        你也可以把它变成一个函数:

        def getColumn(lst, col):
            return [i[col] for i in lst]
        

        演示:

        >>> matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
        >>> def getColumn(lst, col):
            return [i[col] for i in lst]
        
        >>> getColumn(matrix, 0)
        [1, 2, 1]
        >>> getColumn(matrix, 5)
        [2, 5, 2]
        

        希望这会有所帮助!

        【讨论】:

          【解决方案6】:

          List comprehensions 在这里可以很好地工作:

          >>> matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
          >>> # Get all the 0th indexes
          >>> a = [item[0] for item in matrix]
          >>> a
          [1, 2, 1]
          >>> # Get all the 4th indexes
          >>> b = [item[4] for item in matrix]
          >>> b
          [6, 2, 8]
          >>>
          

          【讨论】:

            【解决方案7】:

            您的 for 循环可能没有达到您的预期。 n 不是整数。它是当前行。 我想你想做的是:

            for row in matrix:
                print row[0], row[4]
            

            打印出来,

            1 6
            2 2
            1 8
            

            另外,严格来说,矩阵是列表的列表。要真正拥有一个矩阵,您可能需要使用 numpy。

            【讨论】:

              【解决方案8】:

              Python 中的列表不适合这样使用。如果数据足够大,使用列表推导可能会导致内存和 CPU 问题。如果这是一个问题,请考虑使用numpy

              【讨论】:

                【解决方案9】:

                使用邮编:

                >>> matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
                >>> zip(*matrix)[0]
                (1, 2, 1)
                >>> zip(*matrix)[4]
                (6, 2, 8)
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-03-14
                  • 2018-10-13
                  • 2018-12-25
                  • 1970-01-01
                  • 2017-08-20
                  • 2013-06-14
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多