如何为此使用列表推导?

时间:2018-07-08 00:25:33

标签: python-3.x

我想输入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的输出所示。

3 个答案:

答案 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]]