代码之家  ›  专栏  ›  技术社区  ›  Matt Boehm

在python中创建n*n*n列表时出现问题

  •  2
  • Matt Boehm  · 技术社区  · 15 年前

    我正在尝试创建一个三维n n n在python中列出,比如:

    n=3
    l = [[[0,]*n]*n]*n
    

    不幸的是,这似乎不能像我想象的那样正确地“克隆”列表:

    >>> l
    [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
    >>> l[0][0][0]=1
    >>> l
    [[[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]]]
    

    我在这里做错什么了?

    5 回复  |  直到 15 年前
        1
  •  5
  •   Tordek    15 年前

    问题是 * n 对列表进行简单复制。解决方案是使用嵌套循环,或者尝试使用numpy库。

        2
  •  4
  •   ujsgeyrr1f0d0d0r0h1h0j0j_juj    15 年前

    如果你想用三维矩阵做数值处理,最好用numpy。这很容易:

    >>> import numpy
    >>> numpy.zeros((3,3,3), dtype=numpy.int)
    array([[[0, 0, 0],
            [0, 0, 0],
            [0, 0, 0]],
    
           [[0, 0, 0],
            [0, 0, 0],
            [0, 0, 0]],
    
           [[0, 0, 0],
            [0, 0, 0],
            [0, 0, 0]]])
    >>> _[0,0,0]
    0
    
        3
  •  3
  •   Steve Losh    15 年前

    正如其他人所提到的,它正在构建第二和第三层的参考,而不是克隆。尝试:

    >>> n = 3
    
    >>> l = [[[0]*n for _ in xrange(n)] for _ in xrange(n)]
    
    >>> l[0][0][0] = 1
    
    >>> l
    [[[1, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
    

    或者如果你想少打一点:

    >>> l = [[[0]*n for _ in '.'*n] for _ in '.'*n]
    
        4
  •  2
  •   Dan Lorenc    15 年前

    这不是克隆列表。它一次又一次地插入对同一列表的引用。尝试使用一组嵌套for循环创建列表。

        5
  •  2
  •   Daniel Goldberg    15 年前

    我必须按照莱昂纳多·桑塔加达的建议,再加上创建n维数组/列表是非常不合理的,你应该重新考虑如何保存数据,看看它在一个类或一系列字典(或列表字典)中是否属于更好的类。