gpt4 book ai didi

python - 仅使用列表理解重新排列(列表列表)矩阵

转载 作者:太空狗 更新时间:2023-10-30 02:10:08 25 4
gpt4 key购买 nike

考虑以下 3 x 4 矩阵在 Python 中实现为 3 个长度为 4 的列表:

>>> matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]

下面的列表理解将重新排列矩阵转置行和列:

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

但是假设我需要这个作为结果:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

这是一个重新排列的 4 x 3 矩阵,以便获得原始矩阵的顺序“滚动”,每 3 个元素“中断”到一个新行。

我知道可以制定一个算法来完成任务,但是是否可以仅使用列表理解来获得它?(如果是,如何实现?)


编辑:

采纳的答案应满足以下要求:

  • 必须在基本/干净的 Python 安装上工作(没有额外的库);
  • 必须是(类似于矩阵转置)“单行”。

第二次编辑 + 接受的答案动机:

这是我在必须为此找到解决方案时所做的(基于我在下面自己的评论中给出的建议):

mat = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]

[[mat[(3*(i-1)+j -1)//4+1][(3*(i-1)+j -1)%4] for j in range(3)] for i in range(4)]

请注意,我写的解决方案是特定于这种情况的,但正如 Clodion 也注意到的那样,“公式”可以“通用化”,以便将初始(列表列表)矩阵重新排列为不同的“形状” ".

最佳答案

这样的事情怎么样:

>>> matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]
>>> it = (y for x in matrix for y in x)
>>> list(zip(*[it]*3))
[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]

如果你想要列表列表:

>>> matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]
>>> it = (y for x in matrix for y in x)
>>> list(map(list, zip(*[it]*3)))
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

解释:

  1. 首先,我们创建一个生成器,它给出列表的元素(就好像它被展平为一个列表 - 即 1,2,3,4,5,6,...,12)-我们将其存储在 it 中。

  2. 然后我们调用 zip() 给它 it 三次;由于生成器是相同的,因此它每次都会在 it 中提供下一个元素。

进一步注意:如果需要,您甚至可以将初始矩阵重新排列为与 4 x 3 不同的“形状”,只需将 3 更改为所需的列数即可。 (例如,将其更改为 26,您将分别获得 6 x 2 或 2 x 6 重新排列的矩阵)。


一种不使用zip,只使用列表理解的方法,但需要两行-

>>> matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]
>>> it = (y for x in matrix for y in x)
>>> [[next(it) for _ in range(3)] for _ in range(4)]
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

关于python - 仅使用列表理解重新排列(列表列表)矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31648890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com