【问题标题】:Creating a 2d matrix in python在python中创建一个二维矩阵
【发布时间】:2010-11-19 22:37:26
【问题描述】:

我创建了一个 6x5 二维数组,最初每个单元格中只有 None。然后我读取一个文件并在读取它们时用数据替换 Nones。我首先创建空数组,因为数据在我正在读取的文件中的顺序未定义。我的第一次尝试是这样做的:

x = [[None]*5]*6

导致一些我现在理解的奇怪错误是因为列表上的 * 运算符可能会创建引用而不是副本。

有没有一种简单的方法来创建这个空数组?我可以做一些 for 循环并构建它,但这对于 python 来说似乎是不必要的冗长。

【问题讨论】:

  • 如果您正在处理 n 维数组,您至少应该知道 numpy 存在:numpy.scipy.org 当然,嵌套列表并没有错,并添加一个(大)依赖项,例如numpy 并不总是一件好事。但是,如果您还不知道,那么现在您知道了!

标签: python list


【解决方案1】:

使用嵌套的理解列表:

x = [[None for _ in range(5)] for _ in range(6)]

【讨论】:

    【解决方案2】:

    这里发生了什么是行

    x = [[None]*5]*6
    

    扩展到

    x = [[None, None, None, None, None, None]]*6
    

    此时,您有一个列表,其中包含对单例 None 的 6 个不同引用。您还有一个引用内部列表的列表,因为它是第一个也是唯一的条目。当您将其乘以 6 时,您将获得 5 个对内部列表的引用,正如您所理解的那样。但关键是 inner list 没有问题,只是外部的,所以没有必要将内部列表的构造扩展为理解。

    x = [[None]*5 for _ in range(6)] 
    

    这避免了对任何列表的重复引用,并且我相信它尽可能简洁。

    【讨论】:

      【解决方案3】:

      如果你不走 numpy 路线,你可以用字典伪造二维数组:

      >>> x = dict( ((i,j),None) for i in range(5) for j in range(6) )
      >>> print x[3,4]
      None
      

      【讨论】:

        猜你喜欢
        • 2021-10-04
        • 2017-09-08
        • 2022-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多