【问题标题】:Rotating a list of lists旋转列表列表
【发布时间】:2019-04-14 00:58:29
【问题描述】:
m = [[5,9,1,8],
    [2,4,5,7],
    [6,3,3,2],
    [1,7,6,3]]

    rotated_map = []
    for i in range(len(m[0])):
      rotated_map.append([x[i] for x in m]) 
      print(rotated_map)

    """
    my result = [[5, 2, 6, 1], [9, 4, 3, 7], [1, 5, 3, 6], [8, 7, 2, 3]]

    desired result = [[8,7,2,3],
                      [1,5,3,6],
                      [9,4,3,7],
                      [5,2,6,1]]
    """

我正在尝试通过将列表中的所有最后一个元素首先放入一个列表中,然后将倒数第二个元素放入另一个列表中来旋转列表,依此类推,直到我到达第一个元素。

【问题讨论】:

  • 另外,我什至不知道如何缩进它以获得所需的结果

标签: python


【解决方案1】:

Transpose 带有zip 的列表,然后是reverse 带有[::-1] 语法的列表。

>>> m = [[5, 9, 1, 8], [2, 4, 5, 7], [6, 3, 3, 2], [1, 7, 6, 3]]
>>> list(map(list, zip(*m)))[::-1]
>>> [[8, 7, 2, 3], [1, 5, 3, 6], [9, 4, 3, 7], [5, 2, 6, 1]]

编辑:

如果你想要漂亮的打印,最简单的方法可能是一直使用 numpy 数组。

>>> import numpy as np
>>> 
>>> m = [[5, 9, 1, 8], [2, 4, 5, 7], [6, 3, 3, 2], [1, 7, 6, 3]]
>>> m = np.array(m)
>>> m
>>> 
array([[5, 9, 1, 8],
       [2, 4, 5, 7],
       [6, 3, 3, 2],
       [1, 7, 6, 3]])
>>> 
>>> m.T[::-1]
>>> 
array([[8, 7, 2, 3],
       [1, 5, 3, 6],
       [9, 4, 3, 7],
       [5, 2, 6, 1]])

注意mm.T[::-1] 共享相同的数据,因为m.T[::-1] 只是m 的另一个视图。如果您需要复制数据,请使用

result = m.T[::-1].copy()

【讨论】:

  • 嘿,我还没学过 zip,但你知道如何缩进列表,所以它可能在 4 列中
  • @NaafiuMohammed 您的意思是如何将其打印为正方形?
  • @NaafiuMohammed 关于这个here有一个问题。
【解决方案2】:

您可以使用 zip,使用 * 解压缩列表列表,然后使用 [::-1] 反转结果:

m = [[5,9,1,8],
    [2,4,5,7],
    [6,3,3,2],
    [1,7,6,3]]

res = [list(i) for i in zip(*m)][::-1]

>>> res
[[8, 7, 2, 3], [1, 5, 3, 6], [9, 4, 3, 7], [5, 2, 6, 1]]

如果numpy 是一个选项,转置更容易:

import numpy as np
>>> np.transpose(m)[::-1]
array([[8, 7, 2, 3],
       [1, 5, 3, 6],
       [9, 4, 3, 7],
       [5, 2, 6, 1]])
# or:
>>> np.flip(np.transpose(m),0)
array([[8, 7, 2, 3],
       [1, 5, 3, 6],
       [9, 4, 3, 7],
       [5, 2, 6, 1]])

【讨论】:

  • numpy 不是一个选项
【解决方案3】:

您可以使用numpy 模块来做到这一点。它具有转置数组的属性。检查以下代码:

import numpy as np
m = [[5,9,1,8],
    [2,4,5,7],
    [6,3,3,2],
    [1,7,6,3]]
arr = np.array(m).transpose()
new_list = []
for i in range(arr.shape[0]-1,-1,-1):
    new_list.append(list(arr[i]))

print(new_list)

输出:

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

【讨论】:

  • 嘿,谢谢,我明白了。我想弄清楚如何缩进它,使它看起来像原来的 m
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 2016-11-13
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2017-04-25
相关资源
最近更新 更多