【问题标题】:How to create nested lists in python?如何在python中创建嵌套列表?
【发布时间】:2011-01-11 11:59:12
【问题描述】:

我知道你可以像这样在 python 中轻松创建嵌套列表:

[[1,2],[3,4]]

但是如何创建一个 3x3x3 的零矩阵呢?

[[[0] * 3 for i in range(0, 3)] for j in range (0,3)]

[[[0]*3]*3]*3

似乎不对。没有办法创建它只是将维度列表传递给方法?例如:

CreateArray([3,3,3])

【问题讨论】:

    标签: python list arrays matrix nested-lists


    【解决方案1】:

    只需嵌套乘法语法:

    [[[0] * 3] * 3] * 3
    

    因此使用folds 表达这个操作很简单

    def zeros(dimensions):
        return reduce(lambda x, d: [x] * d, [0] + dimensions)
    

    或者,如果您想避免引用复制,因此更改一项不会影响任何其他项,您应该使用副本:

    import copy
    def zeros(dimensions):
        item = 0
        for dimension in dimensions:
            item = map(copy.copy, [item] * dimension)
       return item
    

    【讨论】:

      【解决方案2】:

      NumPy 解决了这个问题

      http://www.scipy.org/Tentative_NumPy_Tutorial#head-d3f8e5fe9b903f3c3b2a5c0dfceb60d71602cf93

      >>> a = array( [2,3,4] )
      >>> a
      array([2, 3, 4])
      >>> type(a)
      <type 'numpy.ndarray'>
      

      但是,如果您想将 Python 原生列表用作矩阵,则以下辅助方法会变得很方便:

      import copy
      
      def Create(dimensions, item):
          for dimension in dimensions:
              item = map(copy.copy, [item] * dimension)
          return item
      def Get(matrix, position):
          for index in position:
              matrix = matrix[index]
          return matrix
      def Set(matrix, position, value):
          for index in position[:-1]:
              matrix = matrix[index]
          matrix[position[-1]] = value
      

      【讨论】:

        【解决方案3】:

        如果矩阵是您真正需要的,请考虑使用 numpy 包。

        http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros

        这将为您提供一个 3x3x3 的零数组:

        numpy.zeros((3,3,3)) 
        

        您还可以从为科学计算构建的模块的便利功能中受益。

        【讨论】:

        • 哈,我发誓我输入的时候元组就在那里...谢谢 Jader!
        【解决方案4】:

        列表推导式只是为列表初始化增加表现力的语法糖;在你的情况下,我根本不会使用它们,而是使用一个简单的嵌套循环。

        在完全不同的层面上:您认为 NumPy 的 n-dimensional array 可能是更好的方法吗?
        虽然您可以使用列表来实现多维矩阵,但我认为它们并不是实现该目标的最佳工具。

        【讨论】:

          【解决方案5】:

          或者使用定义here的嵌套函数,结合来自itertools模块的repeat(0):

          nest(itertools.repeat(0),[3,3,3])
          

          【讨论】:

            猜你喜欢
            • 2022-01-16
            • 1970-01-01
            • 2017-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-19
            相关资源
            最近更新 更多