我想输入2个数字:行数和列数。然后,我想使用它们来输出按顺序编号的矩阵。我想使用列表理解来做到这一点。以下是可能的输出。
>>>> my_matrix = matrix_fill(3, 4)
>>>> my_matrix
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
我正在使用以下代码输出顺序编号的列表:
def matrix_fill(num_rows, num_col):
list=[i for i in range(num_col)]
return (list)
但是,我无法弄清楚如何使数字顺序列表分成单独的列表,如基于num_rows的输出所示。
答案 0 :(得分:0)
将列表理解嵌套到另一个列表中,使用itertools.count()
生成序列:
import itertools
rows = 3
cols = 4
count_gen = itertools.count() # pass start=1 if you need the sequence to start at 1
my_matrix = [[next(count_gen) for c in range(cols)] for r in range(rows)]
print(my_matrix)
# prints: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
# As a function
def matrix_fill(rows, cols):
count_gen = itertools.count()
return [[next(count_gen) for c in range(cols)] for r in range(rows)]
答案 1 :(得分:0)
我认为您不需要itertools。 The range function can take a step as a parameter。像这样:
def matrix_fill(rows,cols):
return [[x for x in range(1,rows*cols+1)][i:i+cols] for i in range(0,rows*cols,cols)]
然后按预期工作。
>>> matrix_fill(3,4)
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
让我们分解一下,了解正在发生的事情。
>>> [x for x in range(1,3*4+1)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
所以我们要做的是每四个元素获得一个新切片。
>>> [x for x in range(1,3*4+1)][0:4]
[1, 2, 3, 4]
>>> [x for x in range(1,3*4+1)][4:8]
[5, 6, 7, 8]
>>> [x for x in range(1,3*4+1)][8:12]
[9, 10, 11, 12]
因此,我们要遍历长度为“ rows * cols” [x for x in range(1,3*4+1)]
的列表( 3 * 4 )
中的元素,每隔“ cols”个元素创建一个新切片,并将这些切片分组为单一清单。因此,[[x for x in range(1,rows*cols+1)][i:i+cols] for i in range(0,rows*cols,cols)]
是合适的表达式。
答案 2 :(得分:0)
如果您使用numpy
模块,则该方法非常简单,不需要列表理解。
my_matrix = np.arange(1, 13).reshape(3,4)
打印变量my_matrix
显示
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]