反转二维数组中的某些元素以生成指定格式的矩阵,Python 3

Reverse certain elements in a 2d array to produce a matrix in the specified format, Python 3

我有以下用于列表列表的代码,目的是创建数字矩阵:

grid=[[1,2,3,4,5,6,7],[8,9,10,11,12],[13,14,15,16,17],[18,19,20,21,22]]

在使用我认为会反转列表的以下代码时,它会生成一个矩阵...

for i in reversed(grid):
    print(i)

输出为:

[18, 19, 20, 21, 22]
[13, 14, 15, 16, 17]
[8, 9, 10, 11, 12]
[1, 2, 3, 4, 5, 6, 7]

但是,我希望输出如下所示,这样数字 "connect" 就会上升:

[22,21,20,19,18]
[13,14,15,16,17]
[12,11,10,9,8]
[1,2,3,4,5,6,7]

此外,对于赞成票,我首先会对更有效的矩阵生成方法感兴趣。例如,要生成一个 7x7 数组 - 是否可以使用变量来完成,例如 7 或 49。或者对于 10x10 矩阵,10 或 100?

更新: 是的,抱歉 - 子列表的大小应该相同。上面的错别字

根据以下回答更新

这两行:

>>> grid=[[1,2,3,4,5,6,7],[8,9,10,11,12],[13,14,15,16,17],[18,18,20,21,22]]
>>> [lst[::-1] for lst in grid[::-1]]

产生以下输出:

[[22, 21, 20, 18, 18], [17, 16, 15, 14, 13], [12, 11, 10, 9, 8], [7, 6, 5,  4, 3, 2, 1]]

但我希望它们一行接一行地打印,就像一个矩阵......另外,这样我就可以检查输出是否符合我的指定。这就是我所需要的,因为答案就是答案!

您需要反转列表以及 sub-lists:

[lst[::-1] for lst in grid[::-1]]

请注意 lst[::-1] 通过列表切片反转列表,请参阅 here

您可以使用 pprint:

跨多行可视化生成的嵌套列表
>>> from pprint import pprint
>>> pprint([lst[::-1] for lst in grid[::-1]])
[[22, 21, 20, 19, 18],
 [17, 16, 15, 14, 13],
 [12, 11, 10, 9, 8],
 [7, 6, 5, 4, 3, 2, 1]]

通常使用 numpy 创建和操作二维矩阵

然后索引切片可以对行、列重新排序

import numpy as np

def SnakeMatrx(n):
    Sq, Sq.shape = np.arange(n * n), (n, n) # Sq matrix filled with a range
    Sq[1::2,:] = Sq[1::2,::-1] # reverse odd row's columns
    return Sq[::-1,:] + 1    # reverse order of rows, add 1 to every entry

SnakeMatrx(5)
Out[33]: 
array([[21, 22, 23, 24, 25],
       [20, 19, 18, 17, 16],
       [11, 12, 13, 14, 15],
       [10,  9,  8,  7,  6],
       [ 1,  2,  3,  4,  5]])

SnakeMatrx(4)
Out[34]: 
array([[16, 15, 14, 13],
       [ 9, 10, 11, 12],
       [ 8,  7,  6,  5],
       [ 1,  2,  3,  4]])

如果你真的想要列表列表:

SnakeMatrx(4).tolist()
Out[39]: [[16, 15, 14, 13], [9, 10, 11, 12], [8, 7, 6, 5], [1, 2, 3, 4]]

numpy 在 Python 发行版

中很流行但不是官方标准库

当然可以用列表操作来完成

def SnakeLoL(n):
    Sq = [[1 + i + n * j for i in range(n)] for j in range(n)] # Sq LoL filled with a range
    for row in Sq[1::2]:
        row.reverse()     # reverse odd row's columns
    return Sq[::-1][:]    # reverse order of rows
# or maybe more Pythonic for return Sq[::-1][:]
#     Sq.reverse()   # reverse order of rows 
#     return Sq 

SnakeLoL(4)
Out[91]: [[16, 15, 14, 13], [9, 10, 11, 12], [8, 7, 6, 5], [1, 2, 3, 4]]

SnakeLoL(5)
Out[92]: 
[[21, 22, 23, 24, 25],
 [20, 19, 18, 17, 16],
 [11, 12, 13, 14, 15],
 [10, 9, 8, 7, 6],
 [1, 2, 3, 4, 5]]

print(*SnakeLoL(4), sep='\n')
[16, 15, 14, 13]
[9, 10, 11, 12]
[8, 7, 6, 5]
[1, 2, 3, 4]