在Python中从列表创建矩阵

时间:2017-04-28 23:29:19

标签: python arrays

我转发了我的问题,因为当我的问题没有得到正确解答时,有人关闭了我的问题而我自己无法重新开启。

我尝试将单词列表转换为2D数组,而不使用任何numpy和任何扩展方法。我想在没有额外方法的情况下弄明白,但我很困惑。

def __init__(self, array = [], row, col):
    self.row = row
    self.col = col
    self.array = array

我想在__init__方法中转换列表,但不确定如何执行此操作。创建一个单独的方法会更好吗,还是应该将它添加到我的__init__方法中?我想要有效率。

['apple', 'banana', 'dog', 'spider', 'koala']

应该是

[['apple,' 'banana', 'dog'], ['spider', 'koala', None]]

当rows = 3且cols = 3.我还试图实现其他方法,但需要先将列表转换为2D数组。

为了澄清,2行3列数组看起来像:

[['apple', 'banana'], ['dog', 'spider'], ['koala', None]]

2 个答案:

答案 0 :(得分:1)

好吧,我说你的问题是看起来你已经学会了如何上课,在考虑你想要解决的问题之前,你正在写一个班级。

但你想要的只是在一个函数中使用循环来完成,没有任何魔法或外在的东西:

def to_matrix(array, nb_rows, nb_cols):
    # initialise the matrix and a row
    matrix = []
    row = []
    # for each item of the array, O(n)
    for item in array:
        # add an item to the row
        row.append(item)
        # if the row has reached the number of columns
        if len(row) == nb_cols:
            # add the row to the matrix
            matrix.append(row)
            # reset the row for a new iteration
            row = []
    # if once the loop is finished the row isn't empty 
    # and has less elements than the number of columns
    if len(row) <= nb_cols:
        # pad the row with Nones
        row += [None]*(nb_cols-len(row))
        # and add it to the matrix
        matrix.append(row)
    # return the matrix
    return matrix

这是如何运行它:

>>> to_matrix(['apple', 'banana', 'dog', 'spider', 'koala'], 3, 3)
[['apple', 'banana', 'dog'], ['spider', 'koala', None]]
>>> to_matrix(['apple', 'banana', 'dog', 'spider', 'koala'], 3,2)
[['apple', 'banana'], ['dog', 'spider'], ['koala', None]]

该算法:

  • O(n),这意味着它与数组中元素的数量呈线性关系
  • 忽略空行
  • 从溢出的元素中剥离数组,以防矩阵“surface”小于数组的“length”。
  

我想在 init 方法中转换列表,但不确定如何执行此操作。创建一个单独的方法会更好吗,还是应该将它添加到我的 init 方法中?我想要高效。

无论你放置哪个函数都不会影响效率,只是代码的可读性,模块性,灵活性和类的SOLID属性。

因为您没有使用该方法操作您的类(不需要 self ),您应该简单地使其成为上述函数,并在需要的地方调用它。并且构造函数与其他构造函数一样好,它实际上取决于整个拟合的高阶算法。 e.g:

def __init__(self, array, row, col):
    self.array = to_matrix(array, row, col)

答案 1 :(得分:0)

使用生成器的快速版本:

def gen_array(data, count):
    for i, v in enumerate(data):
        if i == count:  # Shorten too long arrays
            break
        yield v
    for c in range(count - len(data)):  # Extend if needed
        yield None

def matrix(array, row, col):
    l = list(gen_array(array, row * col))
    for i in range(0, len(l), col):
        yield l[i:i + col]

mat = list(matrix([1, 2, 3, 4, 5], 3, 4))

可以采用空列表,列表太短和太长。代码也可能更简化。