我转发了我的问题,因为当我的问题没有得到正确解答时,有人关闭了我的问题而我自己无法重新开启。
我尝试将单词列表转换为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]]
答案 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)
,这意味着它与数组中元素的数量呈线性关系我想在 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))
可以采用空列表,列表太短和太长。代码也可能更简化。