如何为二维列表编号?

时间:2019-02-28 01:36:32

标签: python arrays list

我将这些列表包含在我要编号的列表中。我也有两个变量,行和列,它们被当作输入。

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

谢谢!

7 个答案:

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

您可以使用ziprange来获得。

list(zip(*[iter(range(1, row*column+1))]*column))

这会生成一个元组列表,但是如果您需要一个列表列表,则只需map listzip

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

说明:

  1. 我们正在构建一个外部列表,其中每个元素都是int的(内部)列表。
  2. 列表理解构建外部列表。
  3. 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时,相应行的值将在i1+2*10的范围内。