Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反转2d数组中的某些元素以生成指定格式的矩阵,如Python 3_Python_List_Matrix_Reverse - Fatal编程技术网

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

反转2d数组中的某些元素以生成指定格式的矩阵,如Python 3,python,list,matrix,reverse,Python,List,Matrix,Reverse,我有以下列表代码,旨在创建数字矩阵: 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] 但是

我有以下列表代码,旨在创建数字矩阵:

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]
但是,我希望输出如下,以便数字在上升时“连接”:

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

但是我想让他们一行接一行地打印,就像一个矩阵……而且,这样我可以检查输出是否符合我指定的。这就是我本质上所需要的,答案就是答案

您需要反转列表和子列表:

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

您可以使用
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]

子列表的长度不同。这可以称为矩阵吗?还是打字错误?“为了向上投票”?但是你不能向上投票:)哦,对不起-子列表应该都是相同大小的,1-7..并且以7为一组,你能解释一下lst[:-1]的作用吗?另外,我刚刚在上面做了一个编辑,关于如何打印它,使它像一个矩阵。谢谢Chris_Rands。然而,pprint命令并不十分有效-它以任何方式做什么?SyntaxError:编译单个语句时发现多个语句statement@PythonFish它确实有效,您确定您正确复制了我的命令吗?看:谢谢。下面是一个后续问题,如果你有任何直接的答案!当np无法在IDLE-IMPORTROR上工作时,是否有导入numpy的原因:没有名为“numpy”的模块。另外,由于我正在为学生样本开发,我并不想首先使用numpy。事实上,正如问题所说,我希望以最快的方式为指定矩阵生成列表(列和行),例如7x7,并在屏幕上显示为shown@PythonFish添加了一个“纯python”版本,如何每行打印一行列表谢谢-是否有办法确保输出均匀排列,使其看起来像一个矩阵(底部行的偶数空格仅包含一个整数)。此外,上面的版本在打印时不会生成矩阵(输出),而是一个长列表。我怎样才能让它像打印机一样直观地打印出来matrix@PythonFish,我不熟悉格式,但有很多选择