代码之家  ›  专栏  ›  技术社区  ›  Sachihiro

如何在python中创建整数的平方列表?

  •  3
  • Sachihiro  · 技术社区  · 7 年前

    我试图创建一个平方矩阵,给定一个整数输入。

    # for n=3
    m = [[1, 2, 3], [4, 5, 6],[7, 8, 9]] 
    

    我的尝试:

    m = list(list(range(1*i,(n+1)*i,i)) for i in range(1,n+1))
    print(m)
    

    打印此结果:

    [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
    

    4 回复  |  直到 7 年前
        1
  •  1
  •   jpp    7 年前

    有一种方法:

    n = 3
    m = [list(range(1+n*i, 1+n*(i+1))) for i in range(n)]
    
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    

    主要的误解似乎在 找出规律 . 例如,每列中的第一个值可以通过 1 + 3 * i ,在哪里 i 迭代 0, 1, 2 end 的论点 range ,您只需添加 n

    n*i + n = n*(i+1)
    

    另外,如果您乐于使用第三方库,那么NumPy的这一点很简单:

    import numpy as np
    
    n = 3
    A = np.arange(1, n**2 + 1).reshape((n, n))
    
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
        2
  •  1
  •   Aran-Fey Kevin    7 年前

    你可以用 itertools.count list comprehension 使用 next

    import itertools
    
    n = 3
    
    itr = itertools.count(1)  # start counting at 1
    matrix = [[next(itr) for _ in range(n)] for _ in range(n)]
    # result: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    
        3
  •  1
  •   Frayal    7 年前

    它不是一个列表 因此,我知道这不是必需的操作,但它仍然可以是有趣的)

    def func(n):
        l = np.asarray([i for i in range(1,n**2+1)])
        return l.reshape(n,n)
    
    func(3)
    >>> array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
    

    同时考虑计算时间:

    def func(n):
       t = time.time()
       np.arange(1, n**2 + 1).reshape((n, n))
       t1 = time.time()-t
       t = time.time()
       np.asarray([i for i in range(1,n**2+1)]).reshape(n,n)
       t2 = time.time()-t
       t = time.time()
       [list(range(1+n*i, 1+n*(i+1))) for i in range(n)]
       t3 = time.time()-t
       t = time.time()
       itr = itertools.count(1)  # start counting at 1
       matrix = [[next(itr) for _ in range(n)] for _ in range(n)]
       t4 = time.time()-t
       return [t1,t2,t3,t4]
    
    plt.plot([re[0] for re in res],'r',label = 'numpy')
    plt.plot([re[1] for re in res],'b',label = 'asarray')
    plt.plot([re[2] for re in res],'m',label = 'list')
    plt.plot([re[3] for re in res],'g',label = 'itertool')
    plt.legend()
    plt.savefig('plt1.png')
    

    将给出200点的下图: enter image description here

    对于大型矩阵,直接使用@jpp的numpy解决方案

        4
  •  0
  •   gustavovelascoh    7 年前

    你可以使用综合列表。对于零填充矩阵:

    mat = [[0 for i in range(N)] for i in range(N)]
    

    对于具有连续元素的矩阵(从零开始):

    mat = [[(N*j + i) for i in range(N)] for j in range(N)]
    

    mat = [[(N*j + i +1) for i in range(N)] for j in range(N)]
    

    对于方形打印,您可以使用:

    >>> print(*mat,sep="\n")
    [1, 2, 3]
    [4, 5, 6]
    [7, 8, 9]
    
    推荐文章