我将这些列表包含在我要编号的列表中。我也有两个变量,行和列,它们被当作输入。
lst = row*[column*[0]]
这将使列表内的列表充满零,因此,如果row = 6和column = 10,则看起来像:
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
如何更改它,使其看起来像这样:
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
[31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
[41, 42, 43, 44, 45, 46, 47, 48, 49, 50],
[51, 52, 53, 54, 55, 56, 57, 58, 59, 60]]
谢谢!
答案 0 :(得分:3)
我认为这将是最“ pythonic”的方式:
from pprint import pprint
rows = 6
cols = 10
lst = [[(j*cols+i) for i in range(1,cols+1)] for j in range(rows)]
pprint(lst)
输出:
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
[31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
[41, 42, 43, 44, 45, 46, 47, 48, 49, 50],
[51, 52, 53, 54, 55, 56, 57, 58, 59, 60]]
答案 1 :(得分:0)
快速而肮脏的解决方案是:
lst = []
for r in range(row):
lst.append([])
for c in range(column):
lst[r].append(c + r * column)
这可以使用numpy和重塑更干净地实现:
lst = numpy.arange(row * column).reshape(row, column).tolist()
答案 2 :(得分:0)
尝试一下:
l = []
for i in range(0, 6):
row = []
for j in range(1,11):
row.append(i*10+j)
l.append(row)
l
>>>[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
[31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
[41, 42, 43, 44, 45, 46, 47, 48, 49, 50],
[51, 52, 53, 54, 55, 56, 57, 58, 59, 60]]
答案 3 :(得分:0)
为什么不使用如下列表理解:
lst = [[(i+j*column)+1 for i in range(column)] for j in range(row)]
答案 4 :(得分:0)
您可以使用zip
和range
来获得。
list(zip(*[iter(range(1, row*column+1))]*column))
这会生成一个元组列表,但是如果您需要一个列表列表,则只需map
list
至zip
list(map(list, zip(*[iter(range(1, row*column+1))]*column)))
结果:
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59]]
答案 5 :(得分:0)
我考虑解决此问题的方式是认识到您正在生成列表列表,而不是二维数组。
此外,鉴于您的经验水平,我认为程序化方法可能对您来说是一个好的开始。
# Your given information
row = 6
col = 10
# Initialize an empty list of lists
lst = []
# Continuously append lists by converting range() objects
i = 1
while i <= (row * col):
next_i = i + col
arr.append(list(range(i, next_i)))
i = i + next_i
一些不错的下一步是研究range()和list()的文档。乍一看,它们看起来像函数,但实际上它们是不可变且可变的(分别)sequence type
注意:对您的问题的评论是
您碰巧创建了一个列表,其中包含对同一内部列表的大量引用。
为了说明这一点,请观察当我尝试修改(变异)列表列表中的一个元素时在python交互式解释器中发生的事情:
>>> row = 6
>>> column = 10
>>> lst = row*[column*[0]]
>>> lst
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> lst[0][0] = 999 # set just row 0, column 0 to 999
>>> lst
[[999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
结果是每行的第一列已更改为999。这是因为当您将list
创建的[column*[0]]
与{{ 1}},实际上发生的是您获得了同一row
的{{1}}个实例。因此,当您引用其中一个时,您将以这种方式引用所有它们。这种“列表乘法”要小心。
答案 6 :(得分:0)
这也可行:
lst = [list(range(1+i*column, 1+(i+1)*column)) for i in range(row)]
输出:
print (lst)
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], [41, 42, 43, 44, 45, 46, 47, 48, 49, 50], [51, 52, 53, 54, 55, 56, 57, 58, 59, 60]]
说明:
int
的(内部)列表。for
循环之前的表达式list(range(1+i*column, 1+(i+1)*column))
表示此外部列表的每个元素。此元素是int
的列表,首先使用range(1+i*column, 1+(i+1)*column)
构造为范围对象。然后将由此返回的范围对象传递到list()
,以将其转换为列表。请注意,表达式range(1+i*column, 1+(i+1)*column)
是直观的,因为它反映了以下事实:在第i
行中,值将在{{1}的范围内}。例如,在6x10的情况下,当(1+i*column) to 1+(i+1)*column
= 2时,相应行的值将在i
到1+2*10
的范围内。